3.Pandas
3.1 Pandas基本介绍
Python Data Analysis Library或pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。pandas提供了大量能使我们快速便捷的处理数据的函数和方法。
1 2
| import pandas as pd import numpy as np
|
3.1.1 Pandas的基本数据结构
pandas中有两种常用的基本结构
•Series
一维数组,与Numpy中的一维array类似,二者与Python基本的数据结构List也很相似。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series种。
•DataFrame
二维的表格型数据结构,很多功能与R种的data.frame类似。可以将DataFrame理解为Series的容器。
3.1.1.1 Pandas库的Series类型
一维Series可以用一维列表初始化
1 2
| a=pd.Series([1,3,5,np.nan,6,5]) print(a)
|
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 5.0
dtype: float64
默认的情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。
1 2
| b=pd.Series([1,3,5,np.nan,6,5],index=['a','b','c','d','e','f']) print(b)
|
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 5.0
dtype: float64
索引——数据行标签
RangeIndex(start=0, stop=6, step=1)
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
取值
array([ 1., 3., 5., nan, 6., 5.])
1.0
切片
2 5.0
3 NaN
4 6.0
dtype: float64
b 3.0
d NaN
f 5.0
dtype: float64
索引赋值
索引
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 5.0
dtype: float64
1 2
| a.index=list('abcdef') a
|
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 5.0
dtype: float64
3.1.1.2 Pandas库的DataFrame类型
DataFrame初始化
DataFrame是个二维结构,这里首先构造一组时间序列,作为第一维的下标
1 2
| date=pd.date_range('20200101',periods=6) print(date)
|
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06'],
dtype='datetime64[ns]', freq='D')
然后创建一个DataFream结构
1 2
| df=pd.DataFrame(np.random.randn(6,4)) df
|
|
0 |
1 |
2 |
3 |
0 |
-1.490125 |
1.298987 |
-0.543361 |
1.221980 |
1 |
-0.849709 |
0.118608 |
-0.955715 |
0.144980 |
2 |
-0.599598 |
-0.756037 |
-1.795249 |
-0.282495 |
3 |
-0.332586 |
1.750622 |
-1.493345 |
-2.100013 |
4 |
-0.905893 |
-0.254791 |
-1.476728 |
-0.001651 |
5 |
-1.121065 |
-1.861881 |
-0.502420 |
0.523135 |
1 2
| df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD')) df
|
|
A |
B |
C |
D |
2020-01-01 |
0.443978 |
-0.568280 |
0.539422 |
-1.808815 |
2020-01-02 |
-0.941946 |
1.600655 |
-0.165418 |
-0.143333 |
2020-01-03 |
0.058186 |
1.299691 |
-0.722582 |
-0.258170 |
2020-01-04 |
0.912441 |
-1.347266 |
-0.827097 |
-1.189625 |
2020-01-05 |
0.427125 |
0.010411 |
-0.390411 |
1.172277 |
2020-01-06 |
-0.584286 |
-0.428119 |
0.536305 |
1.327480 |
除了向DataFrame中传入二维数组,我们也可以使用字典传入数据
1 2
| df1=pd.DataFrame({'A':1,'B':pd.Timestamp('20200101'),'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'}) df1
|
|
A |
B |
C |
D |
E |
F |
0 |
1 |
2020-01-01 |
1.0 |
3 |
test |
abc |
1 |
1 |
2020-01-01 |
1.0 |
3 |
train |
abc |
2 |
1 |
2020-01-01 |
1.0 |
3 |
test |
abc |
3 |
1 |
2020-01-01 |
1.0 |
3 |
train |
abc |
字典的每个key代表一列,其value可以是各种能够转化为Series的对象
与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同
A int64
B datetime64[ns]
C float64
D int32
E category
F object
dtype: object
DataFrame查看数据
头尾数据
head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5)
|
A |
B |
C |
D |
2020-01-01 |
0.443978 |
-0.568280 |
0.539422 |
-1.808815 |
2020-01-02 |
-0.941946 |
1.600655 |
-0.165418 |
-0.143333 |
2020-01-03 |
0.058186 |
1.299691 |
-0.722582 |
-0.258170 |
2020-01-04 |
0.912441 |
-1.347266 |
-0.827097 |
-1.189625 |
2020-01-05 |
0.427125 |
0.010411 |
-0.390411 |
1.172277 |
|
A |
B |
C |
D |
2020-01-04 |
0.912441 |
-1.347266 |
-0.827097 |
-1.189625 |
2020-01-05 |
0.427125 |
0.010411 |
-0.390411 |
1.172277 |
2020-01-06 |
-0.584286 |
-0.428119 |
0.536305 |
1.327480 |
下标、列标、数据
下标使用index属性查看
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06'],
dtype='datetime64[ns]', freq='D')
列标使用columns属性查看
Index(['A', 'B', 'C', 'D'], dtype='object')
数据值使用values查看
array([[ 0.44397794, -0.56828038, 0.53942245, -1.8088147 ],
[-0.94194603, 1.60065473, -0.16541752, -0.14333282],
[ 0.05818642, 1.2996908 , -0.72258188, -0.25816996],
[ 0.91244089, -1.34726583, -0.82709665, -1.18962492],
[ 0.42712501, 0.01041125, -0.39041139, 1.17227685],
[-0.58428589, -0.42811927, 0.53630517, 1.32747977]])
3.1.2 Pandas读取数据及数据操作
我们以豆瓣的电影数据作为我们深入了解Pandas的示例
1 2
| df_mv=pd.read_excel(r'E:\soft\anaconda\Jupyter_notebook\project3_bilibili_1\data_teacher\课程中用到的数据\豆瓣电影数据.xlsx') df_mv.head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
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 |
香港 |
行操作
Unnamed: 0 0
名字 肖申克的救赎
投票人数 692795
类型 剧情/犯罪
产地 美国
上映时间 1994-09-10 00:00:00
时长 142
年代 1994
评分 9.6
首映地点 多伦多电影节
Name: 0, dtype: object
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
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 |
香港 |
也可以使用 loc
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
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 |
5 |
泰坦尼克号 |
157074.0 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
添加一行
1 2 3 4 5 6 7 8 9 10 11 12
| dit={'名字':'复仇者联盟3', '投票人数':123456, '类型':'剧情/科幻', '产地':'美国', '上映时间':'2017-05-04 00:00:00', '时长':142, '年代':2017, '评分':8.7, '首映地点':'美国'} s=pd.Series(dit) s.name=38738 s
|
名字 复仇者联盟3
投票人数 123456
类型 剧情/科幻
产地 美国
上映时间 2017-05-04 00:00:00
时长 142
年代 2017
评分 8.7
首映地点 美国
Name: 38738, dtype: object
1 2
| df_mv=df_mv.append(s) df_mv.tail()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38734 |
38734.0 |
1935年 |
57.0 |
喜剧/歌舞 |
美国 |
1935-03-15 00:00:00 |
98 |
1935 |
7.6 |
美国 |
38735 |
38735.0 |
血溅画屏 |
95.0 |
剧情/悬疑/犯罪/武侠/古装 |
中国大陆 |
1905-06-08 00:00:00 |
91 |
1986 |
7.1 |
美国 |
38736 |
38736.0 |
魔窟中的幻想 |
51.0 |
惊悚/恐怖/儿童 |
中国大陆 |
1905-06-08 00:00:00 |
78 |
1986 |
8.0 |
美国 |
38737 |
38737.0 |
列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... |
32.0 |
剧情/战争 |
苏联 |
1905-05-30 00:00:00 |
97 |
1977 |
6.6 |
美国 |
38738 |
NaN |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2017-05-04 00:00:00 |
142 |
2017 |
8.7 |
美国 |
删除一行
1 2
| df_mv=df_mv.drop([38738]) df_mv.tail()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38733 |
38733.0 |
神学院 S |
46.0 |
Adult |
法国 |
1905-06-05 00:00:00 |
58 |
1983 |
8.6 |
美国 |
38734 |
38734.0 |
1935年 |
57.0 |
喜剧/歌舞 |
美国 |
1935-03-15 00:00:00 |
98 |
1935 |
7.6 |
美国 |
38735 |
38735.0 |
血溅画屏 |
95.0 |
剧情/悬疑/犯罪/武侠/古装 |
中国大陆 |
1905-06-08 00:00:00 |
91 |
1986 |
7.1 |
美国 |
38736 |
38736.0 |
魔窟中的幻想 |
51.0 |
惊悚/恐怖/儿童 |
中国大陆 |
1905-06-08 00:00:00 |
78 |
1986 |
8.0 |
美国 |
38737 |
38737.0 |
列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... |
32.0 |
剧情/战争 |
苏联 |
1905-05-30 00:00:00 |
97 |
1977 |
6.6 |
美国 |
列操作
Index(['Unnamed: 0', '名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分',
'首映地点'],
dtype='object')
0 肖申克的救赎
1 控方证人
2 美丽人生
3 阿甘正传
4 霸王别姬
Name: 名字, dtype: object
|
名字 |
类型 |
0 |
肖申克的救赎 |
剧情/犯罪 |
1 |
控方证人 |
剧情/悬疑/犯罪 |
2 |
美丽人生 |
剧情/喜剧/爱情 |
3 |
阿甘正传 |
剧情/爱情 |
4 |
霸王别姬 |
剧情/爱情/同性 |
增加一列
1 2
| df_mv['序号']=range(1,len(df_mv)+1) df_mv.head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
序号 |
0 |
0.0 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
1 |
1.0 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
2 |
2 |
2.0 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
3 |
3 |
3.0 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
4 |
4 |
4.0 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
5 |
删除一列
1 2
| df_mv=df_mv.drop('序号',axis=1) df_mv.head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
0.0 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
1.0 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
2 |
2.0 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
3 |
3.0 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
4 |
4.0 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
通过标签选择数据
df.loc[[index],[column]]通过标签选择数据
1
| df_mv.loc[[1,3,4],['名字','评分']]
|
|
名字 |
评分 |
1 |
控方证人 |
9.5 |
3 |
阿甘正传 |
9.4 |
4 |
霸王别姬 |
9.4 |
'控方证人'
条件选择
选取产地为美国的所有电音
1
| df_mv[df_mv['产地']=='中国大陆'][:5]
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
4 |
4.0 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
21 |
21.0 |
大闹天宫 |
74881.0 |
动画/奇幻 |
中国大陆 |
1905-05-14 00:00:00 |
114 |
1961 |
9.2 |
上集 |
29 |
29.0 |
穹顶之下 |
51113.0 |
纪录片 |
中国大陆 |
2015-02-28 00:00:00 |
104 |
2015 |
9.2 |
中国大陆 |
38 |
38.0 |
茶馆 |
10678.0 |
剧情/历史 |
中国大陆 |
1905-06-04 00:00:00 |
118 |
1982 |
9.2 |
美国 |
45 |
45.0 |
山水情 |
10781.0 |
动画/短片 |
中国大陆 |
1905-06-10 00:00:00 |
19 |
1988 |
9.2 |
美国 |
选取产地为美国,且评分大于9的电影
1
| df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
0.0 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
1.0 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
3.0 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
5 |
5.0 |
泰坦尼克号 |
157074.0 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
6 |
6.0 |
辛德勒的名单 |
306904.0 |
剧情/历史/战争 |
美国 |
1993-11-30 00:00:00 |
195 |
1993 |
9.4 |
华盛顿首映 |
选取产地为美国或中国大陆,且评分大于9的电影
1
| df_mv[((df_mv.产地=='美国')|(df_mv.产地=='中国大陆'))&(df_mv.评分>9)].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
0.0 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
1.0 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
3.0 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
4 |
4.0 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
5 |
5.0 |
泰坦尼克号 |
157074.0 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
3.1.3 数据清洗
缺失值处理
dropna:根据标签中的缺失值进行过滤,删除缺失值
fillna:对缺失值进行填充
isnull:返回一个布尔值对象,判断哪些值是缺失值
notnull:isnull的否定式
判断缺失值
1
| df_mv[df_mv['名字'].isnull()].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
231 |
231.0 |
NaN |
144.0 |
纪录片/音乐 |
韩国 |
2011-02-02 00:00:00 |
90 |
2011 |
9.7 |
美国 |
361 |
361.0 |
NaN |
80.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
4 |
1964 |
5.7 |
美国 |
369 |
369.0 |
NaN |
5315.0 |
剧情 |
日本 |
2004-07-10 00:00:00 |
111 |
2004 |
7.5 |
日本 |
372 |
372.0 |
NaN |
263.0 |
短片/音乐 |
英国 |
1998-06-30 00:00:00 |
34 |
1998 |
9.2 |
美国 |
374 |
374.0 |
NaN |
47.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
3 |
1964 |
6.7 |
美国 |
填充缺失值
填充字符类
1
| df_mv[df_mv['名字'].isnull()].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
231 |
231.0 |
NaN |
144.0 |
纪录片/音乐 |
韩国 |
2011-02-02 00:00:00 |
90 |
2011 |
9.7 |
美国 |
361 |
361.0 |
NaN |
80.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
4 |
1964 |
5.7 |
美国 |
369 |
369.0 |
NaN |
5315.0 |
剧情 |
日本 |
2004-07-10 00:00:00 |
111 |
2004 |
7.5 |
日本 |
372 |
372.0 |
NaN |
263.0 |
短片/音乐 |
英国 |
1998-06-30 00:00:00 |
34 |
1998 |
9.2 |
美国 |
374 |
374.0 |
NaN |
47.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
3 |
1964 |
6.7 |
美国 |
1 2
| df_mv['名字'].fillna('未知电影',inplace=True) df_mv[df_mv['名字'].isnull()].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
填充数值类
1 2 3 4 5 6 7 8 9 10 11 12 13
| dit={'名字':'复仇者联盟3', '投票人数':123456, '类型':'剧情/科幻', '产地':'美国', '上映时间':'2017-05-04 00:00:00', '时长':142, '年代':2017, '评分':np.nan, '首映地点':'美国'} s=pd.Series(dit) s.name=38738 df_mv=df_mv.append(s)
|
1 2
| df_mv[df_mv['评分'].isnull()].head()
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38738 |
NaN |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2017-05-04 00:00:00 |
142 |
2017 |
NaN |
美国 |
1 2 3
| df_mv['评分'].fillna(np.mean(df_mv['评分']),inplace=True) df_mv[-1:]
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38738 |
NaN |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2017-05-04 00:00:00 |
142 |
2017 |
6.935704 |
美国 |
删除缺失值
df.dropna(参数)
subset=[‘列名’]:删除该列为空的行
how=’all’:删除全为空值的行或列
inplace=True:覆盖之前的数据
axis=0:选择行或列(=0,删除一行;=1,删除一列),默认为0
38739
1 2
| df_mv1=df_mv.dropna() len(df_mv1)
|
38735
异常值处理
异常值,即在数据集中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等等,都属与异常值的范围。
对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了。
1
| df_mv[(df_mv.投票人数<0)|(df_mv['投票人数']%1!=0)]
|
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
19777 |
19777.0 |
皇家大贼 皇家大 |
-80.00 |
剧情/犯罪 |
中国香港 |
1985-05-31 00:00:00 |
60 |
1985 |
6.3 |
美国 |
19786 |
19786.0 |
日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬 |
-80.00 |
纪录片 |
日本 |
1905-06-26 00:00:00 |
60 |
2004 |
7.9 |
美国 |
19791 |
19791.0 |
女教师 女教 |
8.30 |
剧情/犯罪 |
日本 |
1977-10-29 00:00:00 |
100 |
1977 |
6.6 |
日本 |
19797 |
19797.0 |
女教徒 |
-118.00 |
剧情 |
法国 |
1966-05-06 00:00:00 |
135 |
1966 |
7.8 |
美国 |
19804 |
19804.0 |
女郎漫游仙境 ドレミファ娘の血は騒 |
5.90 |
喜剧/歌舞 |
日本 |
1985-11-03 00:00:00 |
80 |
1985 |
6.7 |
日本 |
19820 |
19820.0 |
女仆日记 |
12.87 |
剧情 |
法国 |
2015-04-01 00:00:00 |
96 |
2015 |
5.7 |
法国 |
38055 |
38055.0 |
逃出亚卡拉 |
12.87 |
剧情/动作/惊悚/犯罪 |
美国 |
1979-09-20 00:00:00 |
112 |
1979 |
7.8 |
美国 |
3.1.4 数据保存
数据处理之后,然后将数据重新保存到原文件
1
| df_mv.to_excel('movie_data.xlsx')
|
3.2 Pandas操作
1 2
| import pandas as pd import numpy as np
|
以豆瓣电影为例
1 2 3
| df=pd.read_excel('./movie_data.xlsx') df=df.drop('Unnamed: 0',axis=1) df.head()
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
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 |
香港 |
3.2.1 数据格式转换
查看格式
dtype('float64')
格式转化
1 2
| df['投票人数']=df['投票人数'].astype('int') df['投票人数'].dtype
|
dtype('int32')
将年代格式转化为整型
dtype('O')
1
| df['年代']=df['年代'].astype('int')
|
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-23-7db608df647a> in <module>
----> 1 df['年代']=df['年代'].astype('int')
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)
5544 else:
5545 # else, only a single dtype is given
-> 5546 new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors,)
5547 return self._constructor(new_data).__finalize__(self, method="astype")
5548
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)
593 self, dtype, copy: bool = False, errors: str = "raise"
594 ) -> "BlockManager":
--> 595 return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
596
597 def convert(
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, align_keys, **kwargs)
404 applied = b.apply(f, **kwargs)
405 else:
--> 406 applied = getattr(b, f)(**kwargs)
407 result_blocks = _extend_blocks(applied, result_blocks)
408
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)
593 vals1d = values.ravel()
594 try:
--> 595 values = astype_nansafe(vals1d, dtype, copy=True)
596 except (ValueError, TypeError):
597 # e.g. astype_nansafe can fail on object-dtype of strings
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)
970 # work around NumPy brokenness, #1987
971 if np.issubdtype(dtype.type, np.integer):
--> 972 return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
973
974 # if we have a datetime/timedelta array of objects
pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()
ValueError: invalid literal for int() with base 10: '2008\u200e'
1 2
| df[df.年代=='2008\u200e']
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
15205 |
狂蟒惊魂 |
544 |
恐怖 |
中国大陆 |
2008-04-08 00:00:00 |
93 |
2008 |
2.7 |
美国 |
1
| df[df.年代=='2008\u200e']['年代'].values
|
array(['2008\u200e'], dtype=object)
1 2
| df.loc[15205,'年代']=2008 df.loc[15205]
|
名字 狂蟒惊魂
投票人数 544
类型 恐怖
产地 中国大陆
上映时间 2008-04-08 00:00:00
时长 93
年代 2008
评分 2.7
首映地点 美国
Name: 15205, dtype: object
1 2
| df['年代']=df['年代'].astype('int') df['年代'][:5]
|
0 1994
1 1957
2 1997
3 1994
4 1993
Name: 年代, dtype: int32
将时长转化为整数格式
1
| df['时长']=df['时长'].astype('int')
|
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-32-83bf9b6fa2b3> in <module>
----> 1 df['时长']=df['时长'].astype('int')
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)
5544 else:
5545 # else, only a single dtype is given
-> 5546 new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors,)
5547 return self._constructor(new_data).__finalize__(self, method="astype")
5548
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)
593 self, dtype, copy: bool = False, errors: str = "raise"
594 ) -> "BlockManager":
--> 595 return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
596
597 def convert(
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, align_keys, **kwargs)
404 applied = b.apply(f, **kwargs)
405 else:
--> 406 applied = getattr(b, f)(**kwargs)
407 result_blocks = _extend_blocks(applied, result_blocks)
408
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)
593 vals1d = values.ravel()
594 try:
--> 595 values = astype_nansafe(vals1d, dtype, copy=True)
596 except (ValueError, TypeError):
597 # e.g. astype_nansafe can fail on object-dtype of strings
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)
970 # work around NumPy brokenness, #1987
971 if np.issubdtype(dtype.type, np.integer):
--> 972 return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
973
974 # if we have a datetime/timedelta array of objects
pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()
ValueError: invalid literal for int() with base 10: '8U'
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
31644 |
一个被隔绝的世界 |
46 |
纪录片/短片 |
瑞典 |
2001-10-25 00:00:00 |
8U |
1948 |
7.8 |
美国 |
1
| df.drop(31644,inplace=True)
|
1
| df['时长']=df['时长'].astype('int')
|
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-83bf9b6fa2b3> in <module>
----> 1 df['时长']=df['时长'].astype('int')
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)
5544 else:
5545 # else, only a single dtype is given
-> 5546 new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors,)
5547 return self._constructor(new_data).__finalize__(self, method="astype")
5548
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)
593 self, dtype, copy: bool = False, errors: str = "raise"
594 ) -> "BlockManager":
--> 595 return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
596
597 def convert(
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, align_keys, **kwargs)
404 applied = b.apply(f, **kwargs)
405 else:
--> 406 applied = getattr(b, f)(**kwargs)
407 result_blocks = _extend_blocks(applied, result_blocks)
408
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)
593 vals1d = values.ravel()
594 try:
--> 595 values = astype_nansafe(vals1d, dtype, copy=True)
596 except (ValueError, TypeError):
597 # e.g. astype_nansafe can fail on object-dtype of strings
E:\soft\anaconda\anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)
970 # work around NumPy brokenness, #1987
971 if np.issubdtype(dtype.type, np.integer):
--> 972 return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
973
974 # if we have a datetime/timedelta array of objects
pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()
ValueError: invalid literal for int() with base 10: '12J'
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
32949 |
渔业危机 |
41 |
纪录片 |
英国 |
2009-06-19 00:00:00 |
12J |
2008 |
8.2 |
USA |
1
| df.drop(32949,inplace=True)
|
1
| df['时长']=df['时长'].astype('int')
|
0 142
1 116
2 116
3 142
4 171
Name: 时长, dtype: int32
3.1.2 排序
单值排序
默认排序
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
肖申克的救赎 |
692795 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
控方证人 |
42995 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
2 |
美丽人生 |
327855 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
3 |
阿甘正传 |
580897 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
4 |
霸王别姬 |
478523 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
5 |
泰坦尼克号 |
157074 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
6 |
辛德勒的名单 |
306904 |
剧情/历史/战争 |
美国 |
1993-11-30 00:00:00 |
195 |
1993 |
9.4 |
华盛顿首映 |
7 |
新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai |
24355 |
剧情/动作/科幻/动画/奇幻 |
日本 |
1997-07-19 00:00:00 |
87 |
1997 |
9.4 |
日本 |
8 |
银魂完结篇:直到永远的万事屋 劇場版 銀魂 完結篇 万事屋よ |
21513 |
剧情/动画 |
日本 |
2013-07-06 00:00:00 |
110 |
2013 |
9.4 |
日本 |
9 |
这个杀手不太冷 |
662552 |
剧情/动作/犯罪 |
法国 |
1994-09-14 00:00:00 |
133 |
1994 |
9.4 |
法国 |
按照投票人数进行排序
1 2
| df.sort_values(by='投票人数')[:5]
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
19797 |
女教徒 |
-118 |
剧情 |
法国 |
1966-05-06 00:00:00 |
135 |
1966 |
7.8 |
美国 |
19777 |
皇家大贼 皇家大 |
-80 |
剧情/犯罪 |
中国香港 |
1985-05-31 00:00:00 |
60 |
1985 |
6.3 |
美国 |
19786 |
日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬 |
-80 |
纪录片 |
日本 |
1905-06-26 00:00:00 |
60 |
2004 |
7.9 |
美国 |
19804 |
女郎漫游仙境 ドレミファ娘の血は騒 |
5 |
喜剧/歌舞 |
日本 |
1985-11-03 00:00:00 |
80 |
1985 |
6.7 |
日本 |
19791 |
女教师 女教 |
8 |
剧情/犯罪 |
日本 |
1977-10-29 00:00:00 |
100 |
1977 |
6.6 |
日本 |
1 2
| df.sort_values(by='投票人数',ascending=False)[:5]
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
肖申克的救赎 |
692795 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
9 |
这个杀手不太冷 |
662552 |
剧情/动作/犯罪 |
法国 |
1994-09-14 00:00:00 |
133 |
1994 |
9.4 |
法国 |
22 |
盗梦空间 |
642134 |
剧情/动作/科幻/悬疑/冒险 |
美国 |
2010-09-01 00:00:00 |
148 |
2010 |
9.2 |
中国大陆 |
3 |
阿甘正传 |
580897 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
99 |
三傻大闹宝莱坞 |
549808 |
剧情/喜剧/爱情/歌舞 |
印度 |
2011-12-08 00:00:00 |
171 |
2009 |
9.1 |
中国大陆 |
按照年代进行排序
1
| df.sort_values(by='年代')[:5]
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
14048 |
利兹大桥 |
126 |
短片 |
英国 |
1888-10 |
60 |
1888 |
7.2 |
美国 |
1700 |
朗德海花园场景 |
650 |
短片 |
英国 |
1888-10-14 |
60 |
1888 |
8.7 |
美国 |
26170 |
恶作剧 |
51 |
短片 |
美国 |
1905-03-04 00:00:00 |
60 |
1890 |
4.8 |
美国 |
10627 |
可怜的比埃洛 |
176 |
喜剧/爱情/动画/短片 |
法国 |
1892-10-28 |
60 |
1892 |
7.5 |
法国 |
14455 |
迪克森实验音膜 |
121 |
短片 |
美国 |
1905-03-08 00:00:00 |
60 |
1894 |
7.2 |
美国 |
多个值排序
先按照评分排序,再按照投票人数排序
1
| df.sort_values(by=['评分','投票人数'],ascending=False)[:5]
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
9278 |
平安结祈 平安結 |
208 |
音乐 |
日本 |
2012-02-24 00:00:00 |
60 |
2012 |
9.9 |
美国 |
13882 |
武之舞 |
128 |
纪录片 |
中国大陆 |
1997-02-01 00:00:00 |
60 |
34943 |
9.9 |
美国 |
1110 |
未知电影 |
76 |
科幻/纪录片 |
美国 |
1905-06-23 00:00:00 |
75 |
2001 |
9.9 |
美国 |
23559 |
未作回答的问题:伯恩斯坦哈佛六讲 |
61 |
纪录片 |
美国 |
1905-05-29 00:00:00 |
60 |
1973 |
9.9 |
美国 |
35470 |
未知电影 |
46 |
纪录片/音乐 |
韩国 |
2013-10-31 00:00:00 |
90 |
2013 |
9.9 |
韩国 |
1
| df.sort_values(by=['评分','投票人数'],ascending=[False,True])[:5]
|
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
25270 |
索科洛夫:巴黎现场 |
43 |
音乐 |
法国 |
2002-11-04 00:00:00 |
127 |
2002 |
9.9 |
美国 |
35465 |
未知电影 |
46 |
纪录片/音乐 |
韩国 |
2013-10-31 00:00:00 |
90 |
2013 |
9.9 |
韩国 |
23556 |
未作回答的问题:伯恩斯坦哈佛六讲 |
61 |
纪录片 |
美国 |
1905-05-29 00:00:00 |
60 |
1973 |
9.9 |
美国 |
1110 |
未知电影 |
76 |
科幻/纪录片 |
美国 |
1905-06-23 00:00:00 |
75 |
2001 |
9.9 |
美国 |
9278 |
平安结祈 平安結 |
208 |
音乐 |
日本 |
2012-02-24 00:00:00 |
60 |
2012 |
9.9 |
美国 |
3.1.3基本统计分析
描述性统计
dataframe.describe():对dataframe中的数值数据进行描述性统计
|
投票人数 |
时长 |
年代 |
评分 |
count |
38737.000000 |
38737.000000 |
38737.000000 |
38737.000000 |
mean |
6189.178098 |
89.053128 |
1998.789091 |
6.935649 |
std |
26150.607777 |
83.333528 |
253.195493 |
1.270094 |
min |
-118.000000 |
1.000000 |
1888.000000 |
2.000000 |
25% |
98.000000 |
60.000000 |
1990.000000 |
6.300000 |
50% |
341.000000 |
92.000000 |
2005.000000 |
7.100000 |
75% |
1741.000000 |
106.000000 |
2010.000000 |
7.800000 |
max |
692795.000000 |
11500.000000 |
39180.000000 |
9.900000 |
通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
13882 |
武之舞 |
128 |
纪录片 |
中国大陆 |
1997-02-01 00:00:00 |
60 |
34943 |
9.9 |
美国 |
17115 |
妈妈回来吧-中国打工村的孩子 |
49 |
纪录片 |
日本 |
2007-04-08 00:00:00 |
109 |
39180 |
8.9 |
美国 |
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
19690 |
怒海余生 |
54 |
剧情/家庭/冒险 |
美国 |
1937-09-01 00:00:00 |
11500 |
1937 |
7.9 |
美国 |
38730 |
喧闹村的孩子们 |
36 |
家庭 |
瑞典 |
1986-12-06 00:00:00 |
9200 |
1986 |
8.7 |
瑞典 |
1 2 3
| df.drop(df[df.年代>2020].index,inplace=True) df.drop(df[df.时长>1000].index,inplace=True) df.describe()
|
|
投票人数 |
时长 |
年代 |
评分 |
count |
38730.000000 |
38730.000000 |
38730.000000 |
38730.000000 |
mean |
6190.297005 |
88.523806 |
1996.981461 |
6.935420 |
std |
26152.838459 |
37.946156 |
19.934657 |
1.270018 |
min |
5.000000 |
1.000000 |
1888.000000 |
2.000000 |
25% |
98.000000 |
60.000000 |
1990.000000 |
6.300000 |
50% |
341.000000 |
92.000000 |
2005.000000 |
7.100000 |
75% |
1741.000000 |
106.000000 |
2010.000000 |
7.800000 |
max |
692795.000000 |
958.000000 |
2017.000000 |
9.900000 |
1 2
| df.index=range(len(df))
|
最值
692795
5
均值和中值
6190.297004905758
341.0
方差和标准差
1.6129445680877672
1.2700175463700363
求和
239750203
相关系数、协方差
1 2
| df[['投票人数','评分']].corr()
|
|
投票人数 |
评分 |
投票人数 |
1.000000 |
0.122925 |
评分 |
0.122925 |
1.000000 |
1 2
| df[['投票人数','评分']].cov()
|
|
投票人数 |
评分 |
投票人数 |
6.839710e+08 |
4082.897271 |
评分 |
4.082897e+03 |
1.612945 |
计数
数据替换
38730
array(['美国', '意大利', '中国大陆', '日本', '法国', '英国', '韩国', '中国香港', '阿根廷', '德国',
'印度', '其他', '加拿大', '波兰', '泰国', '澳大利亚', '西班牙', '俄罗斯', '中国台湾', '荷兰',
'丹麦', '比利时', 'USA', '苏联', '墨西哥', '巴西', '瑞典', '西德'], dtype=object)
28
产地中包含了一些重复数据,比如美国和USA,德国和西德,俄罗斯和苏联
我们可以通过数据替换的方法将这些相同的国家的电影数据合并一下
1 2 3
| df['产地'].replace('USA','美国',inplace=True) df['产地'].replace(['西德','苏联'],['德国','俄罗斯'],inplace=True) len(df['产地'].unique())
|
24
计算每一年代电影的数量
1
| df['年代'].value_counts()[:10]
|
2012 2042
2013 2001
2008 1963
2014 1887
2010 1886
2011 1866
2009 1862
2007 1711
2015 1592
2006 1515
Name: 年代, dtype: int64
电影产出前5位的国家或地区
1
| df['产地'].value_counts()[:5]
|
美国 11979
日本 5051
中国大陆 3802
中国香港 2851
法国 2816
Name: 产地, dtype: int64
1
| df.to_excel('./movie_data2.xlsx')
|
3.1.4 数据透视
Pandas提供了一个数据透视表功能,名为pivot_table。
使用pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚的知道你通过透视表解决了什么问题,虽然pivot_table看起来知识一个简单的函数,但是它能够快速的对数据进行强大的分析。
基础形式
1 2
| pd.set_option('max_columns',100) pd.set_option('max_rows',500)
|
1
| pd.pivot_table(df,index=['年代'])
|
|
投票人数 |
时长 |
评分 |
年代 |
|
|
|
1888 |
388.000000 |
60.000000 |
7.950000 |
1890 |
51.000000 |
60.000000 |
4.800000 |
1892 |
176.000000 |
60.000000 |
7.500000 |
1894 |
112.666667 |
60.000000 |
6.633333 |
1895 |
959.875000 |
60.000000 |
7.575000 |
1896 |
984.250000 |
60.000000 |
7.037500 |
1897 |
67.000000 |
60.000000 |
6.633333 |
1898 |
578.500000 |
60.000000 |
7.450000 |
1899 |
71.000000 |
9.500000 |
6.900000 |
1900 |
175.285714 |
36.714286 |
7.228571 |
1901 |
164.500000 |
47.250000 |
7.250000 |
1902 |
1934.166667 |
34.666667 |
7.483333 |
1903 |
295.625000 |
29.625000 |
6.968750 |
1904 |
195.875000 |
41.250000 |
7.212500 |
1905 |
332.600000 |
43.800000 |
6.820000 |
1906 |
189.857143 |
30.571429 |
7.342857 |
1907 |
213.600000 |
31.800000 |
7.020000 |
1908 |
258.833333 |
34.166667 |
7.150000 |
1909 |
58.600000 |
20.600000 |
7.560000 |
1910 |
105.200000 |
41.800000 |
6.940000 |
1911 |
240.000000 |
25.750000 |
7.375000 |
1912 |
152.200000 |
16.400000 |
7.920000 |
1913 |
66.125000 |
57.750000 |
6.862500 |
1914 |
104.923077 |
25.923077 |
6.473077 |
1915 |
314.900000 |
56.800000 |
7.260000 |
1916 |
613.666667 |
43.833333 |
7.758333 |
1917 |
124.416667 |
31.333333 |
7.075000 |
1918 |
357.083333 |
35.166667 |
7.200000 |
1919 |
179.850000 |
62.400000 |
7.490000 |
1920 |
636.500000 |
59.357143 |
7.492857 |
1921 |
729.818182 |
57.363636 |
7.750000 |
1922 |
767.090909 |
66.363636 |
7.804545 |
1923 |
426.000000 |
74.055556 |
7.883333 |
1924 |
371.785714 |
81.178571 |
8.053571 |
1925 |
1104.280000 |
84.440000 |
7.788000 |
1926 |
443.608696 |
80.304348 |
7.773913 |
1927 |
695.275862 |
87.241379 |
7.751724 |
1928 |
404.825000 |
71.775000 |
7.945000 |
1929 |
740.542857 |
69.371429 |
7.440000 |
1930 |
555.080000 |
74.160000 |
7.360000 |
1931 |
1468.666667 |
78.523810 |
7.483333 |
1932 |
600.081081 |
77.540541 |
7.294595 |
1933 |
729.720000 |
76.360000 |
7.430000 |
1934 |
776.490196 |
83.196078 |
7.519608 |
1935 |
887.695652 |
73.673913 |
7.515217 |
1936 |
1465.466667 |
76.266667 |
7.635000 |
1937 |
1580.224490 |
85.510204 |
7.575510 |
1938 |
552.000000 |
85.973684 |
7.736842 |
1939 |
5911.857143 |
97.387755 |
7.520408 |
1940 |
5548.743590 |
92.820513 |
7.571795 |
1941 |
1552.808511 |
89.127660 |
7.427660 |
1942 |
2607.754717 |
78.264151 |
7.554717 |
1943 |
742.842105 |
78.456140 |
7.615789 |
1944 |
1007.370370 |
81.925926 |
7.538889 |
1945 |
989.020408 |
86.959184 |
7.673469 |
1946 |
1034.457627 |
85.016949 |
7.606780 |
1947 |
439.400000 |
87.120000 |
7.453333 |
1948 |
1186.505747 |
88.206897 |
7.657471 |
1949 |
641.685393 |
81.988764 |
7.646067 |
1950 |
2235.026316 |
80.157895 |
7.655263 |
1951 |
956.101266 |
85.632911 |
7.636709 |
1952 |
1473.540230 |
81.528736 |
7.743678 |
1953 |
4786.113636 |
84.170455 |
7.567045 |
1954 |
2180.245098 |
85.549020 |
7.702941 |
1955 |
1983.739130 |
83.669565 |
7.580000 |
1956 |
1054.605442 |
76.408163 |
7.600000 |
1957 |
2973.579439 |
87.355140 |
7.652336 |
1958 |
886.196721 |
82.975410 |
7.536885 |
1959 |
1725.070312 |
90.070312 |
7.571875 |
1960 |
1446.274809 |
101.312977 |
7.569466 |
1961 |
3186.833333 |
98.215686 |
7.744118 |
1962 |
1972.118881 |
91.615385 |
7.704895 |
1963 |
1184.027972 |
92.020979 |
7.536364 |
1964 |
1107.763736 |
89.714286 |
7.523077 |
1965 |
1988.184049 |
90.478528 |
7.576074 |
1966 |
1319.525140 |
89.486034 |
7.518994 |
1967 |
1237.289773 |
91.590909 |
7.484659 |
1968 |
1096.220930 |
91.744186 |
7.317442 |
1969 |
593.111111 |
98.666667 |
7.370048 |
1970 |
676.789474 |
96.973684 |
7.291053 |
1971 |
1368.506849 |
96.315068 |
7.155708 |
1972 |
2299.096618 |
96.289855 |
7.268116 |
1973 |
800.103286 |
94.882629 |
7.250235 |
1974 |
1685.789238 |
95.318386 |
7.062332 |
1975 |
2222.739796 |
97.566327 |
7.071429 |
1976 |
1340.618026 |
95.055794 |
7.107725 |
1977 |
957.127273 |
98.031818 |
7.148182 |
1978 |
1001.820896 |
94.467662 |
7.096517 |
1979 |
1878.621145 |
96.000000 |
7.296035 |
1980 |
2407.683036 |
94.178571 |
7.186607 |
1981 |
1609.062044 |
93.321168 |
7.157299 |
1982 |
2142.729323 |
91.984962 |
7.297368 |
1983 |
1541.191336 |
92.169675 |
7.310108 |
1984 |
2667.173469 |
90.918367 |
7.375170 |
1985 |
1588.096573 |
93.616822 |
7.278505 |
1986 |
2828.506173 |
89.145062 |
7.256790 |
1987 |
3128.775510 |
88.938776 |
7.284548 |
1988 |
4800.227621 |
88.859335 |
7.265729 |
1989 |
2994.417303 |
88.458015 |
7.210687 |
1990 |
4965.587786 |
91.882952 |
7.149109 |
1991 |
4685.819512 |
93.370732 |
7.154634 |
1992 |
5486.133333 |
92.572414 |
7.223678 |
1993 |
8117.759637 |
95.269841 |
7.195692 |
1994 |
11479.255061 |
91.344130 |
7.262348 |
1995 |
8132.605317 |
94.441718 |
7.289366 |
1996 |
5095.883946 |
95.243714 |
7.258801 |
1997 |
8243.938547 |
94.970205 |
7.330168 |
1998 |
7431.790295 |
91.131716 |
7.238302 |
1999 |
7137.049600 |
92.457600 |
7.188000 |
2000 |
5907.770178 |
92.191518 |
7.134063 |
2001 |
8489.757246 |
90.958937 |
7.110145 |
2002 |
6552.593333 |
91.584444 |
7.069778 |
2003 |
7891.964248 |
90.558360 |
7.137750 |
2004 |
8587.632599 |
90.424670 |
7.031366 |
2005 |
6506.110847 |
92.080760 |
7.030008 |
2006 |
7278.260726 |
90.144554 |
6.914719 |
2007 |
6253.837522 |
86.628288 |
6.875102 |
2008 |
6750.996943 |
85.144167 |
6.910647 |
2009 |
8716.364662 |
86.384533 |
6.750000 |
2010 |
9576.387593 |
83.434252 |
6.770361 |
2011 |
8763.110397 |
84.125938 |
6.577010 |
2012 |
7082.787463 |
85.099902 |
6.458374 |
2013 |
7603.723138 |
84.902049 |
6.392604 |
2014 |
7723.302597 |
85.997880 |
6.259777 |
2015 |
7841.408291 |
89.863693 |
6.141960 |
2016 |
7176.019380 |
91.329457 |
5.868217 |
2017 |
123456.000000 |
142.000000 |
6.935704 |
多个索引 index=[‘’,’’]
实际上,大多数的pivot_table参数可以通过列表获取多个值
1 2 3
| pd.set_option('max_columns',100) pd.set_option('max_rows',500) pd.pivot_table(df,index=['年代','产地'])
|
|
|
投票人数 |
时长 |
评分 |
年代 |
产地 |
|
|
|
1888 |
英国 |
388.000000 |
60.000000 |
7.950000 |
1890 |
美国 |
51.000000 |
60.000000 |
4.800000 |
1892 |
法国 |
176.000000 |
60.000000 |
7.500000 |
1894 |
法国 |
148.000000 |
60.000000 |
7.000000 |
美国 |
95.000000 |
60.000000 |
6.450000 |
... |
... |
... |
... |
... |
2016 |
法国 |
39.000000 |
93.250000 |
7.475000 |
美国 |
10563.848485 |
91.984848 |
6.540909 |
英国 |
14607.272727 |
85.545455 |
7.200000 |
韩国 |
1739.850000 |
106.100000 |
5.730000 |
2017 |
美国 |
123456.000000 |
142.000000 |
6.935704 |
1511 rows × 3 columns
指定需要统计汇总的数据 values
1
| pd.pivot_table(df,index=['年代','产地'],values=['评分'])
|
|
|
评分 |
年代 |
产地 |
|
1888 |
英国 |
7.950000 |
1890 |
美国 |
4.800000 |
1892 |
法国 |
7.500000 |
1894 |
法国 |
7.000000 |
美国 |
6.450000 |
... |
... |
... |
2016 |
法国 |
7.475000 |
美国 |
6.540909 |
英国 |
7.200000 |
韩国 |
5.730000 |
2017 |
美国 |
6.935704 |
1511 rows × 1 columns
指定函数 aggfunc
1
| pd.pivot_table(df,index=['年代','产地'],values=['投票人数'],aggfunc=np.sum)
|
|
|
投票人数 |
年代 |
产地 |
|
1888 |
英国 |
776 |
1890 |
美国 |
51 |
1892 |
法国 |
176 |
1894 |
法国 |
148 |
美国 |
190 |
... |
... |
... |
2016 |
法国 |
156 |
美国 |
697214 |
英国 |
160680 |
韩国 |
34797 |
2017 |
美国 |
123456 |
1511 rows × 1 columns
通过将“投票人数”和“评分”列进行对应分组,对“产地”实现数据聚合和总结
1
| pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc=[np.sum,np.mean])
|
|
sum |
mean |
|
投票人数 |
评分 |
投票人数 |
评分 |
产地 |
|
|
|
|
中国台湾 |
5237466 |
4367.200000 |
8474.864078 |
7.066667 |
中国大陆 |
41435313 |
23058.000000 |
10898.293793 |
6.064703 |
中国香港 |
23285389 |
18457.700000 |
8167.446159 |
6.474114 |
丹麦 |
394784 |
1434.700000 |
1993.858586 |
7.245960 |
俄罗斯 |
3167110 |
11031.900000 |
2098.813784 |
7.310736 |
其他 |
3054119 |
13895.900000 |
1590.686979 |
7.237448 |
加拿大 |
1384765 |
4868.400000 |
1915.304288 |
6.733610 |
印度 |
1146271 |
2453.400000 |
3210.843137 |
6.872269 |
墨西哥 |
139613 |
843.400000 |
1173.218487 |
7.087395 |
巴西 |
357136 |
733.500000 |
3536.000000 |
7.262376 |
意大利 |
2502215 |
5377.300000 |
3340.740988 |
7.179306 |
日本 |
18000667 |
36339.300000 |
3563.782815 |
7.194476 |
比利时 |
170987 |
1003.300000 |
1230.122302 |
7.217986 |
法国 |
10213966 |
20384.700000 |
3627.118608 |
7.238885 |
波兰 |
159577 |
1347.000000 |
881.640884 |
7.441989 |
泰国 |
1564881 |
1796.100000 |
5322.724490 |
6.109184 |
澳大利亚 |
1415713 |
2093.400000 |
4719.043333 |
6.978000 |
瑞典 |
290077 |
1423.300000 |
1510.817708 |
7.413021 |
美国 |
101929672 |
83216.435704 |
8509.030136 |
6.946860 |
英国 |
13249562 |
20789.400000 |
4797.089790 |
7.526937 |
荷兰 |
144836 |
1114.500000 |
934.425806 |
7.190323 |
西班牙 |
1486733 |
3139.900000 |
3326.024609 |
7.024385 |
阿根廷 |
258271 |
843.700000 |
2226.474138 |
7.273276 |
韩国 |
8761080 |
8596.400000 |
6484.885270 |
6.362990 |
非数值处理 fill_value
非数值(NaN)难以处理,如果想移除他们,可以使用 fill_value 将其设置为0
1
| pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0)
|
|
sum |
mean |
|
年代 |
投票人数 |
时长 |
评分 |
年代 |
投票人数 |
时长 |
评分 |
产地 |
|
|
|
|
|
|
|
|
中国台湾 |
1235388 |
5237466 |
53925 |
4367.200000 |
1999.009709 |
8474.864078 |
87.257282 |
7.066667 |
中国大陆 |
7621488 |
41435313 |
309608 |
23058.000000 |
2004.599684 |
10898.293793 |
81.432930 |
6.064703 |
中国香港 |
5676627 |
23285389 |
252431 |
18457.700000 |
1991.100316 |
8167.446159 |
88.541214 |
6.474114 |
丹麦 |
395820 |
394784 |
17444 |
1434.700000 |
1999.090909 |
1993.858586 |
88.101010 |
7.245960 |
俄罗斯 |
3006734 |
3167110 |
140761 |
11031.900000 |
1992.534129 |
2098.813784 |
93.280981 |
7.310736 |
其他 |
3837588 |
3054119 |
167168 |
13895.900000 |
1998.743750 |
1590.686979 |
87.066667 |
7.237448 |
加拿大 |
1447780 |
1384765 |
57919 |
4868.400000 |
2002.461964 |
1915.304288 |
80.109267 |
6.733610 |
印度 |
716133 |
1146271 |
43203 |
2453.400000 |
2005.974790 |
3210.843137 |
121.016807 |
6.872269 |
墨西哥 |
237145 |
139613 |
10929 |
843.400000 |
1992.815126 |
1173.218487 |
91.840336 |
7.087395 |
巴西 |
201987 |
357136 |
8869 |
733.500000 |
1999.871287 |
3536.000000 |
87.811881 |
7.262376 |
意大利 |
1487142 |
2502215 |
77902 |
5377.300000 |
1985.503338 |
3340.740988 |
104.008011 |
7.179306 |
日本 |
10101505 |
18000667 |
427863 |
36339.300000 |
1999.902000 |
3563.782815 |
84.708573 |
7.194476 |
比利时 |
277930 |
170987 |
11447 |
1003.300000 |
1999.496403 |
1230.122302 |
82.352518 |
7.217986 |
法国 |
5608811 |
10213966 |
253169 |
20384.700000 |
1991.765270 |
3627.118608 |
89.903764 |
7.238885 |
波兰 |
359652 |
159577 |
14613 |
1347.000000 |
1987.027624 |
881.640884 |
80.734807 |
7.441989 |
泰国 |
590684 |
1564881 |
26002 |
1796.100000 |
2009.129252 |
5322.724490 |
88.442177 |
6.109184 |
澳大利亚 |
600896 |
1415713 |
25549 |
2093.400000 |
2002.986667 |
4719.043333 |
85.163333 |
6.978000 |
瑞典 |
381491 |
290077 |
17898 |
1423.300000 |
1986.932292 |
1510.817708 |
93.218750 |
7.413021 |
美国 |
23892986 |
101929672 |
1070310 |
83216.435704 |
1994.572669 |
8509.030136 |
89.348861 |
6.946860 |
英国 |
5514959 |
13249562 |
244005 |
20789.400000 |
1996.726647 |
4797.089790 |
88.343592 |
7.526937 |
荷兰 |
310199 |
144836 |
11685 |
1114.500000 |
2001.283871 |
934.425806 |
75.387097 |
7.190323 |
西班牙 |
894710 |
1486733 |
40455 |
3139.900000 |
2001.588367 |
3326.024609 |
90.503356 |
7.024385 |
阿根廷 |
232468 |
258271 |
10638 |
843.700000 |
2004.034483 |
2226.474138 |
91.706897 |
7.273276 |
韩国 |
2712969 |
8761080 |
134734 |
8596.400000 |
2008.119171 |
6484.885270 |
99.729090 |
6.362990 |
计算总合数据 margins=True
1
| pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
|
|
sum |
mean |
|
年代 |
投票人数 |
时长 |
评分 |
年代 |
投票人数 |
时长 |
评分 |
产地 |
|
|
|
|
|
|
|
|
中国台湾 |
1235388 |
5237466 |
53925 |
4367.200000 |
1999.009709 |
8474.864078 |
87.257282 |
7.066667 |
中国大陆 |
7621488 |
41435313 |
309608 |
23058.000000 |
2004.599684 |
10898.293793 |
81.432930 |
6.064703 |
中国香港 |
5676627 |
23285389 |
252431 |
18457.700000 |
1991.100316 |
8167.446159 |
88.541214 |
6.474114 |
丹麦 |
395820 |
394784 |
17444 |
1434.700000 |
1999.090909 |
1993.858586 |
88.101010 |
7.245960 |
俄罗斯 |
3006734 |
3167110 |
140761 |
11031.900000 |
1992.534129 |
2098.813784 |
93.280981 |
7.310736 |
其他 |
3837588 |
3054119 |
167168 |
13895.900000 |
1998.743750 |
1590.686979 |
87.066667 |
7.237448 |
加拿大 |
1447780 |
1384765 |
57919 |
4868.400000 |
2002.461964 |
1915.304288 |
80.109267 |
6.733610 |
印度 |
716133 |
1146271 |
43203 |
2453.400000 |
2005.974790 |
3210.843137 |
121.016807 |
6.872269 |
墨西哥 |
237145 |
139613 |
10929 |
843.400000 |
1992.815126 |
1173.218487 |
91.840336 |
7.087395 |
巴西 |
201987 |
357136 |
8869 |
733.500000 |
1999.871287 |
3536.000000 |
87.811881 |
7.262376 |
意大利 |
1487142 |
2502215 |
77902 |
5377.300000 |
1985.503338 |
3340.740988 |
104.008011 |
7.179306 |
日本 |
10101505 |
18000667 |
427863 |
36339.300000 |
1999.902000 |
3563.782815 |
84.708573 |
7.194476 |
比利时 |
277930 |
170987 |
11447 |
1003.300000 |
1999.496403 |
1230.122302 |
82.352518 |
7.217986 |
法国 |
5608811 |
10213966 |
253169 |
20384.700000 |
1991.765270 |
3627.118608 |
89.903764 |
7.238885 |
波兰 |
359652 |
159577 |
14613 |
1347.000000 |
1987.027624 |
881.640884 |
80.734807 |
7.441989 |
泰国 |
590684 |
1564881 |
26002 |
1796.100000 |
2009.129252 |
5322.724490 |
88.442177 |
6.109184 |
澳大利亚 |
600896 |
1415713 |
25549 |
2093.400000 |
2002.986667 |
4719.043333 |
85.163333 |
6.978000 |
瑞典 |
381491 |
290077 |
17898 |
1423.300000 |
1986.932292 |
1510.817708 |
93.218750 |
7.413021 |
美国 |
23892986 |
101929672 |
1070310 |
83216.435704 |
1994.572669 |
8509.030136 |
89.348861 |
6.946860 |
英国 |
5514959 |
13249562 |
244005 |
20789.400000 |
1996.726647 |
4797.089790 |
88.343592 |
7.526937 |
荷兰 |
310199 |
144836 |
11685 |
1114.500000 |
2001.283871 |
934.425806 |
75.387097 |
7.190323 |
西班牙 |
894710 |
1486733 |
40455 |
3139.900000 |
2001.588367 |
3326.024609 |
90.503356 |
7.024385 |
阿根廷 |
232468 |
258271 |
10638 |
843.700000 |
2004.034483 |
2226.474138 |
91.706897 |
7.273276 |
韩国 |
2712969 |
8761080 |
134734 |
8596.400000 |
2008.119171 |
6484.885270 |
99.729090 |
6.362990 |
All |
77337135 |
239749731 |
3428380 |
268585.635704 |
1996.982338 |
6190.764350 |
88.526868 |
6.935359 |
对不同值执行不同函数
可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加简洁才性。
对各个产地的投票人数求和,对评分求均值
1
| pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
|
|
投票人数 |
评分 |
产地 |
|
|
中国台湾 |
5237466 |
7.066667 |
中国大陆 |
41435313 |
6.064703 |
中国香港 |
23285389 |
6.474114 |
丹麦 |
394784 |
7.245960 |
俄罗斯 |
3167110 |
7.310736 |
其他 |
3054119 |
7.237448 |
加拿大 |
1384765 |
6.733610 |
印度 |
1146271 |
6.872269 |
墨西哥 |
139613 |
7.087395 |
巴西 |
357136 |
7.262376 |
意大利 |
2502215 |
7.179306 |
日本 |
18000667 |
7.194476 |
比利时 |
170987 |
7.217986 |
法国 |
10213966 |
7.238885 |
波兰 |
159577 |
7.441989 |
泰国 |
1564881 |
6.109184 |
澳大利亚 |
1415713 |
6.978000 |
瑞典 |
290077 |
7.413021 |
美国 |
101929672 |
6.946860 |
英国 |
13249562 |
7.526937 |
荷兰 |
144836 |
7.190323 |
西班牙 |
1486733 |
7.024385 |
阿根廷 |
258271 |
7.273276 |
韩国 |
8761080 |
6.362990 |
透视表过滤
1
| table=pd.pivot_table(df,index=['年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
|
pandas.core.frame.DataFrame
|
投票人数 |
评分 |
年代 |
|
|
1888 |
776 |
7.950000 |
1890 |
51 |
4.800000 |
1892 |
176 |
7.500000 |
1894 |
338 |
6.633333 |
1895 |
7679 |
7.575000 |
1994年被誉为电影史上伟大的一年,但是通过数据我们可以发现,1994年的平均分并不是很高。1924年的电影平均分最高。
1
| table[table.index==1994]
|
|
投票人数 |
评分 |
年代 |
|
|
1994 |
5670752 |
7.262348 |
1
| table.sort_values('评分',ascending=False)[:10]
|
|
投票人数 |
评分 |
年代 |
|
|
1924 |
10410 |
8.053571 |
1888 |
776 |
7.950000 |
1928 |
16193 |
7.945000 |
1912 |
761 |
7.920000 |
1923 |
7668 |
7.883333 |
1922 |
16876 |
7.804545 |
1925 |
27607 |
7.788000 |
1926 |
10203 |
7.773913 |
1916 |
7364 |
7.758333 |
1927 |
20163 |
7.751724 |
按照多个索引来进行汇总
1
| pd.pivot_table(df,index=['产地','年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
|
|
|
投票人数 |
评分 |
产地 |
年代 |
|
|
中国台湾 |
1963 |
121 |
6.400000 |
1965 |
461 |
6.800000 |
1966 |
51 |
7.900000 |
1967 |
4444 |
8.000000 |
1968 |
178 |
7.400000 |
... |
... |
... |
... |
韩国 |
2012 |
610829 |
6.064151 |
2013 |
1130983 |
6.098198 |
2014 |
453152 |
5.650833 |
2015 |
349808 |
5.423853 |
2016 |
34797 |
5.730000 |
1511 rows × 2 columns
3.3 pandas
3.3.1 数据重塑和轴向旋转
(1)层次化索引
层次化索引是pandas的一项重要功能,他能使我们再一个轴上拥有多个索引
Series的层次化索引
通过unstack方法可以将Series变成一个DataFrame
感谢鼓励