目录
数据处理之后,然后将数据重新保存到movie_data.xlsx
python数据分析之Panads-1
1.1 Panads基本介绍
Python Data Analysis Library 或 Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
In [ ]:
import pandas as pd import numpy as np
Pandas 基本数据结构
pandas
有两种常用的基本结构:
Series
- 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很接近。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
DataFrame
- 二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
1.2 Pandas库的series类型
一维Series
可以用一维列表初始化:
In [ ]:
s = pd.Series([1,3,5,np.nan,6,8]) #index = ['a','b','c','d','x','y'])设置索引,np.nan设置空值 print(s) ss = pd.Series([1,3,5,np.nan,6,8], index = ['a','b','c','d','x','y']) #index = ['a','b','c','d','x','y']) print(ss)
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 a 1.0 b 3.0 c 5.0 d NaN x 6.0 y 8.0 dtype: float64
默认情况下,Series
的下标都是数字(可以使用额外参数指定),类型是统一的。
索引——数据的行标签
In [ ]:
s.index #显示索引,从0到6(不含),1为步长
Out[ ]:
RangeIndex(start=0, stop=6, step=1)
值
In [ ]:
s.values
Out[ ]:
array([ 1., 3., 5., nan, 6., 8.])
In [ ]:
s[3]
Out[ ]:
nan
切片操作
In [ ]:
s[2:5] #左闭右开
Out[ ]:
2 5.0 3 NaN 4 6.0 dtype: float64
In [ ]:
s[::2]
Out[ ]:
0 1.0 2 5.0 4 6.0 dtype: float64
索引赋值
In [ ]:
s.index.name = '索引' # 索引命名 s
Out[ ]:
索引 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
In [ ]:
s.index = list('abcdef') s
Out[ ]:
a 1.0 b 3.0 c 5.0 d NaN e 6.0 f 8.0 dtype: float64
In [ ]:
s['a':'c':2] #依据自己定义的数据类型进行切片,不是左闭右开了
Out[ ]:
a 1.0 c 5.0 dtype: float64
1.3 Pandas库的DataFrame类型
DataFrame
则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
In [ ]:
date = pd.date_range("20180101", periods = 6) print(date)
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06'], dtype='datetime64[ns]', freq='D')
然后创建一个DataFrame
结构:
In [ ]:
df = pd.DataFrame(np.random.randn(6,4), index = date, columns = list("ABCD")) # 6行4列 index行索引 columns列索引 df
Out[ ]:
A | B | C | D | |
---|---|---|---|---|
2018-01-01 | -1.241676 | -1.571394 | 0.106047 | 0.358907 |
2018-01-02 | -1.439755 | -0.808185 | 0.060131 | 0.215150 |
2018-01-03 | -2.075786 | 1.107769 | 0.879275 | -0.306302 |
2018-01-04 | 0.590896 | 0.010819 | 0.730009 | -1.382649 |
2018-01-05 | 0.886241 | 0.162687 | -0.272916 | -1.304492 |
2018-01-06 | 1.202565 | 1.495311 | 0.613457 | 0.862442 |
默认情况下,如果不指定index
参数和columns
,那么它们的值将从用0开始的数字替代。
In [ ]:
df = pd.DataFrame(np.random.randn(6,4)) df
Out[ ]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | -0.396986 | 0.091685 | 2.873997 | 0.393454 |
1 | 0.395675 | 0.977006 | -0.542596 | -0.023109 |
2 | -0.886602 | -1.016435 | -0.083989 | -1.354806 |
3 | -0.845909 | 0.886694 | 0.388768 | -0.199145 |
4 | -0.255430 | -1.652886 | -0.746169 | 0.803175 |
5 | -1.025498 | -0.401567 | 0.347465 | -1.291498 |
除了向DataFrame
中传入二维数组,我们也可以使用字典传入数据:
In [ ]:
df2 = pd.DataFrame({'A':1.,'B':pd.Timestamp("20181001"),'C':pd.Series(1,index = list(range(4)),dtype = float),'D':np.array([3]*4, dtype = int),'E':pd.Categorical(["test","train","test","train"]),'F':"abc"}) #B:时间戳,E分类类型 df2
Out[ ]:
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2018-10-01 | 1.0 | 3 | test | abc |
1 | 1.0 | 2018-10-01 | 1.0 | 3 | train | abc |
2 | 1.0 | 2018-10-01 | 1.0 | 3 | test | abc |
3 | 1.0 | 2018-10-01 | 1.0 | 3 | train | abc |
In [ ]:
df2.dtypes #查看各个列的数据类型
Out[ ]:
A float64 B datetime64[ns] C float64 D int32 E category F object dtype: object
字典的每个key
代表一列,其value
可以是各种能够转化为Series
的对象。
与Series
要求所有的类型都一致不同,DataFrame
只要求每一列数据的格式相同。
查看数据
头尾数据
head
和tail
方法可以分别查看最前面几行和最后面几行的数据(默认为5):
In [ ]:
df.head()
Out[ ]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | -0.396986 | 0.091685 | 2.873997 | 0.393454 |
1 | 0.395675 | 0.977006 | -0.542596 | -0.023109 |
2 | -0.886602 | -1.016435 | -0.083989 | -1.354806 |
3 | -0.845909 | 0.886694 | 0.388768 | -0.199145 |
4 | -0.255430 | -1.652886 | -0.746169 | 0.803175 |
最后3行:
In [ ]:
df.tail(3) # 没有参数 默认最后5行
Out[ ]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
3 | -0.845909 | 0.886694 | 0.388768 | -0.199145 |
4 | -0.255430 | -1.652886 | -0.746169 | 0.803175 |
5 | -1.025498 | -0.401567 | 0.347465 | -1.291498 |
下标,列标,数据
下标使用index
属性查看:
In [ ]:
df.index
Out[ ]:
RangeIndex(start=0, stop=6, step=1)
列标使用columns
属性查看:
In [ ]:
df.columns
Out[ ]:
RangeIndex(start=0, stop=4, step=1)
数据值使用values
查看:
In [ ]:
df.values
Out[ ]:
array([[-0.39698634, 0.09168473, 2.87399654, 0.39345434], [ 0.39567543, 0.97700555, -0.5425961 , -0.02310854], [-0.88660194, -1.01643485, -0.08398921, -1.3548057 ], [-0.84590888, 0.88669353, 0.38876774, -0.19914459], [-0.25542972, -1.65288596, -0.74616901, 0.80317473], [-1.02549823, -0.40156725, 0.34746527, -1.29149787]])
1.4 pandas读取数据及数据操作
我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。
In [ ]:
df = pd.read_excel(r".\豆瓣电影数据.xlsx",index_col = 0) #csv:read_csv;绝对路径或相对路径默认在当前文件夹下。r告诉编译器不需要转义 #具体其它参数可以去查帮助文档 ?pd.read_excel
In [ ]:
df.head()
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
行操作
In [ ]:
df.iloc[0] # 查看某行
Out[ ]:
名字 肖申克的救赎 投票人数 692795.0 类型 剧情/犯罪 产地 美国 上映时间 1994-09-10 00:00:00 时长 142 年代 1994 评分 9.6 首映地点 多伦多电影节 Name: 0, dtype: object
In [ ]:
df.iloc[0:5] #左闭右开
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
也可以使用loc
In [ ]:
df.loc[0:5] #不是左闭右开,而是都闭
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
5 | 泰坦尼克号 | 157074.0 | 剧情/爱情/灾难 | 美国 | 2012-04-10 00:00:00 | 194 | 2012 | 9.4 | 中国大陆 |
添加一行
In [ ]:
# 通过定义字典数据来添加 dit = {"名字":"复仇者联盟3","投票人数":123456,"类型":"剧情/科幻","产地":"美国","上映时间":"2018-05-04 00:00:00","时长":142,"年代":2018,"评分":np.nan,"首映地点":"美国"} s = pd.Series(dit) s.name = 38738
In [ ]:
s
Out[ ]:
名字 复仇者联盟3 投票人数 123456 类型 剧情/科幻 产地 美国 上映时间 2018-05-04 00:00:00 时长 142 年代 2018 评分 NaN 首映地点 美国 Name: 38738, dtype: object
In [ ]:
df = df.append(s) #覆盖掉原来的数据重新进行赋值 df[-5:]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
38734 | 1935年 | 57.0 | 喜剧/歌舞 | 美国 | 1935-03-15 00:00:00 | 98 | 1935 | 7.6 | 美国 |
38735 | 血溅画屏 | 95.0 | 剧情/悬疑/犯罪/武侠/古装 | 中国大陆 | 1905-06-08 00:00:00 | 91 | 1986 | 7.1 | 美国 |
38736 | 魔窟中的幻想 | 51.0 | 惊悚/恐怖/儿童 | 中国大陆 | 1905-06-08 00:00:00 | 78 | 1986 | 8.0 | 美国 |
38737 | 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... | 32.0 | 剧情/战争 | 苏联 | 1905-05-30 00:00:00 | 97 | 1977 | 6.6 | 美国 |
38738 | 复仇者联盟3 | 123456.0 | 剧情/科幻 | 美国 | 2018-05-04 00:00:00 | 142 | 2018 | NaN | 美国 |
删除一行
In [ ]:
df = df.drop([38738]) df[-5:]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
38733 | 神学院 S | 46.0 | Adult | 法国 | 1905-06-05 00:00:00 | 58 | 1983 | 8.6 | 美国 |
38734 | 1935年 | 57.0 | 喜剧/歌舞 | 美国 | 1935-03-15 00:00:00 | 98 | 1935 | 7.6 | 美国 |
38735 | 血溅画屏 | 95.0 | 剧情/悬疑/犯罪/武侠/古装 | 中国大陆 | 1905-06-08 00:00:00 | 91 | 1986 | 7.1 | 美国 |
38736 | 魔窟中的幻想 | 51.0 | 惊悚/恐怖/儿童 | 中国大陆 | 1905-06-08 00:00:00 | 78 | 1986 | 8.0 | 美国 |
38737 | 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... | 32.0 | 剧情/战争 | 苏联 | 1905-05-30 00:00:00 | 97 | 1977 | 6.6 | 美国 |
列操作
In [ ]:
df.columns
Out[ ]:
Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')
In [ ]:
df["名字"][:5] #后面中括号表示只想看到的行数,下同
Out[ ]:
0 肖申克的救赎 1 控方证人 2 美丽人生 3 阿甘正传 4 霸王别姬 Name: 名字, dtype: object
In [ ]:
df[["名字","类型"]][:5]
Out[ ]:
名字 | 类型 | |
---|---|---|
0 | 肖申克的救赎 | 剧情/犯罪 |
1 | 控方证人 | 剧情/悬疑/犯罪 |
2 | 美丽人生 | 剧情/喜剧/爱情 |
3 | 阿甘正传 | 剧情/爱情 |
4 | 霸王别姬 | 剧情/爱情/同性 |
增加一列
In [ ]:
df["序号"] = range(1,len(df)+1) #生成序号的基本方式 df[:5]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | 序号 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 | 1 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 | 2 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 | 3 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 | 4 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 | 5 |
删除一列
In [ ]:
df = df.drop("序号",axis = 1) #axis指定方向,0为行1为列,默认为0 df[:5]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
通过标签选择数据
df.loc[[index],[colunm]]
通过标签选择数据
In [ ]:
df.loc[1,"名字"]
Out[ ]:
'控方证人'
In [ ]:
df.loc[[1,3,5,7,9],["名字","评分"]] #多行跳行多列跳列选择
Out[ ]:
名字 | 评分 | |
---|---|---|
1 | 控方证人 | 9.5 |
3 | 阿甘正传 | 9.4 |
5 | 泰坦尼克号 | 9.4 |
7 | 新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai | 9.4 |
9 | 这个杀手不太冷 | 9.4 |
条件选择
选取产地为美国的所有电影
In [ ]:
df[df["产地"] == "美国"][:5] # df["产地"] == "美国"运行结果为bool,只取前5行
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
5 | 泰坦尼克号 | 157074.0 | 剧情/爱情/灾难 | 美国 | 2012-04-10 00:00:00 | 194 | 2012 | 9.4 | 中国大陆 |
6 | 辛德勒的名单 | 306904.0 | 剧情/历史/战争 | 美国 | 1993-11-30 00:00:00 | 195 | 1993 | 9.4 | 华盛顿首映 |
选取产地为美国的所有电影,并且评分大于9分的电影
In [ ]:
df[(df.产地 == "美国") & (df.评分 > 9)][:5] #df.标签:更简洁的写法
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
5 | 泰坦尼克号 | 157074.0 | 剧情/爱情/灾难 | 美国 | 2012-04-10 00:00:00 | 194 | 2012 | 9.4 | 中国大陆 |
6 | 辛德勒的名单 | 306904.0 | 剧情/历史/战争 | 美国 | 1993-11-30 00:00:00 | 195 | 1993 | 9.4 | 华盛顿首映 |
选取产地为美国或中国大陆的所有电影,并且评分大于9分
In [ ]:
df[((df.产地 == "美国") | (df.产地 == "中国大陆")) & (df.评分 > 9)][:5]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
5 | 泰坦尼克号 | 157074.0 | 剧情/爱情/灾难 | 美国 | 2012-04-10 00:00:00 | 194 | 2012 | 9.4 | 中国大陆 |
1.5 缺失值及异常值处理
缺失值处理方法:
方法 | 说明 |
---|---|
dropna | 根据标签中的缺失值进行过滤,删除缺失值 |
fillna | 对缺失值进行填充 |
isnull | 返回一个布尔值对象,判断哪些值是缺失值 |
notnull | isnull的否定式 |
判断缺失值
In [ ]:
df[df["名字"].isnull()][:10] # 列出前10个缺失名字的
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
231 | NaN | 144.0 | 纪录片/音乐 | 韩国 | 2011-02-02 00:00:00 | 90 | 2011 | 9.7 | 美国 |
361 | NaN | 80.0 | 短片 | 其他 | 1905-05-17 00:00:00 | 4 | 1964 | 5.7 | 美国 |
369 | NaN | 5315.0 | 剧情 | 日本 | 2004-07-10 00:00:00 | 111 | 2004 | 7.5 | 日本 |
372 | NaN | 263.0 | 短片/音乐 | 英国 | 1998-06-30 00:00:00 | 34 | 1998 | 9.2 | 美国 |
374 | NaN | 47.0 | 短片 | 其他 | 1905-05-17 00:00:00 | 3 | 1964 | 6.7 | 美国 |
375 | NaN | 1193.0 | 短片/音乐 | 法国 | 1905-07-01 00:00:00 | 10 | 2010 | 7.7 | 美国 |
411 | NaN | 32.0 | 短片 | 其他 | 1905-05-17 00:00:00 | 3 | 1964 | 7.0 | 美国 |
432 | NaN | 1081.0 | 剧情/动作/惊悚/犯罪 | 美国 | 2016-02-26 00:00:00 | 115 | 2016 | 6.0 | 美国 |
441 | NaN | 213.0 | 恐怖 | 美国 | 2007-03-06 00:00:00 | 83 | 2007 | 3.2 | 美国 |
448 | NaN | 110.0 | 纪录片 | 荷兰 | 2002-04-19 00:00:00 | 48 | 2000 | 9.3 | 美国 |
In [ ]:
df[df["名字"].notnull()][:5]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
填充缺失值
In [ ]:
df[df["评分"].isnull()][:10] #注意这里特地将前面加入的复仇者联盟令其评分缺失来举例
Out[ ]:
In [ ]:
df["评分"].fillna(np.mean(df["评分"]), inplace = True) #使用均值来进行替代,inplace意为直接在原始数据中进行修改 df[-5:]
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
38733 | 神学院 S | 46.0 | Adult | 法国 | 1905-06-05 00:00:00 | 58 | 1983 | 8.6 | 美国 |
38734 | 1935年 | 57.0 | 喜剧/歌舞 | 美国 | 1935-03-15 00:00:00 | 98 | 1935 | 7.6 | 美国 |
38735 | 血溅画屏 | 95.0 | 剧情/悬疑/犯罪/武侠/古装 | 中国大陆 | 1905-06-08 00:00:00 | 91 | 1986 | 7.1 | 美国 |
38736 | 魔窟中的幻想 | 51.0 | 惊悚/恐怖/儿童 | 中国大陆 | 1905-06-08 00:00:00 | 78 | 1986 | 8.0 | 美国 |
38737 | 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... | 32.0 | 剧情/战争 | 苏联 | 1905-05-30 00:00:00 | 97 | 1977 | 6.6 | 美国 |
In [ ]:
df1 = df.fillna("未知电影") #谨慎使用,除非确定所有的空值都是在一列中,否则所有的其他列的空值都会填成这个 #不可采用df["名字"].fillna("未知电影")的形式,因为填写后数据格式就变了,变成Series了
In [ ]:
df1[df1["名字"].isnull()][:10]
Out[ ]:
删除缺失值
df.dropna() 参数 how = 'all':删除全为空值的行或列 inplace = True: 覆盖之前的数据 axis = 0: 选择行或列,默认是行
In [ ]:
len(df)
Out[ ]:
38738
In [ ]:
df2 = df.dropna()
In [ ]:
len(df2)
Out[ ]:
38175
In [ ]:
df.dropna(inplace = True)
In [ ]:
len(df) #inplace覆盖掉原来的值
Out[ ]:
38175
处理异常值
异常值,即在数据集中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等,都属于异常值的范围。
In [ ]:
df[df["投票人数"] < 0] #直接删除,或者找原始数据来修正都行
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
19777 | 皇家大贼 皇家大 | -80.0 | 剧情/犯罪 | 中国香港 | 1985-05-31 00:00:00 | 60 | 1985 | 6.3 | 美国 |
19786 | 日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬 | -80.0 | 纪录片 | 日本 | 1905-06-26 00:00:00 | 60 | 2004 | 7.9 | 美国 |
19797 | 女教徒 | -118.0 | 剧情 | 法国 | 1966-05-06 00:00:00 | 135 | 1966 | 7.8 | 美国 |
In [ ]:
df[df["投票人数"] % 1 != 0] #小数异常值
Out[ ]:
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
19791 | 女教师 女教 | 8.30 | 剧情/犯罪 | 日本 | 1977-10-29 00:00:00 | 100 | 1977 | 6.6 | 日本 |
19804 | 女郎漫游仙境 ドレミファ娘の血は騒 | 5.90 | 喜剧/歌舞 | 日本 | 1985-11-03 00:00:00 | 80 | 1985 | 6.7 | 日本 |
19820 | 女仆日记 | 12.87 | 剧情 | 法国 | 2015-04-01 00:00:00 | 96 | 2015 | 5.7 | 法国 |
38055 | 逃出亚卡拉 | 12.87 | 剧情/动作/惊悚/犯罪 | 美国 | 1979-09-20 00:00:00 | 112 | 1979 | 7.8 | 美国 |
对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了
其他属性的异常值处理,我们会在格式转换部分,进一步讨论
In [ ]:
df = df[df.投票人数 > 0] df = df[df["投票人数"] % 1 == 0]
1.6 数据保存
数据处理之后,然后将数据重新保存到movie_data.xlsx
In [ ]:
df.to_excel("movie_data.xlsx") #默认路径为现在文件夹所在的路径