3.Pandas

3.3 Pandas进阶

1
2
import pandas as pd
import numpy as np

3.3.1 数据重塑和轴向旋转

(1)层次化索引

层次化索引是pandas的一项重要功能,他能使我们再一个轴上拥有多个索引

Series的层次化索引
1
2
s=pd.Series(np.arange(1,10),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,3]])
s
a  1    1
   2    2
   3    3
b  1    4
   2    5
c  3    6
   1    7
d  2    8
   3    9
dtype: int32
1
s.index
MultiIndex([('a', 1),
            ('a', 2),
            ('a', 3),
            ('b', 1),
            ('b', 2),
            ('c', 3),
            ('c', 1),
            ('d', 2),
            ('d', 3)],
           )
1
s['a':'b']
a  1    1
   2    2
   3    3
b  1    4
   2    5
dtype: int32
1
s[:,1]
a    1
b    4
c    7
dtype: int32

通过unstack方法可以将Series变成一个DataFrame

1
s.unstack()
1 2 3
a 1.0 2.0 3.0
b 4.0 5.0 NaN
c 7.0 NaN 6.0
d NaN 8.0 9.0
1
s.unstack().stack()
a  1    1.0
   2    2.0
   3    3.0
b  1    4.0
   2    5.0
c  1    7.0
   3    6.0
d  2    8.0
   3    9.0
dtype: float64
DataFrame的层次化索引

对于DataFrame来说,行和列都能够进行层次化索引。

1
2
data=pd.DataFrame(np.arange(12).reshape(4,3))
data
0 1 2
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
1
2
data=pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]])
data
0 1 2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
1
2
data=pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B'],['Z','X','C']])
data
A B
Z X C
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

选取列

1
data['A']
Z X
a 1 0 1
2 3 4
b 1 6 7
2 9 10

设置名称

1
2
data.index.names=['row1','row2']
data
A B
Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
1
2
data.columns.names=['column1','column2']
data
column1 A B
column2 Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

行顺序调整

1
data.swaplevel('row1','row2')
column1 A B
column2 Z X C
row2 row1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
2 b 9 10 11
层次化——电影数据示列

数据导入

1
2
df=pd.read_excel('movie_data2.xlsx')
df.head()
Unnamed: 0 名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 0 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 00:00:00 142 1994 9.6 多伦多电影节
1 1 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116 1957 9.5 美国
2 2 美丽人生 327855 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116 1997 9.5 意大利
3 3 阿甘正传 580897 剧情/爱情 美国 1994-06-23 00:00:00 142 1994 9.4 洛杉矶首映
4 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171 1993 9.4 香港
1
df.index
RangeIndex(start=0, stop=38730, step=1)
set_index:可以把列变成索引
reset_index:把索引变成列

把产地和年代同时设置成索引,产地是外层索引,年代是内层索引

1
2
df=df.set_index(['产地','年代'])
df.head()
Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
产地 年代
美国 1994 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节
1957 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国
意大利 1997 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利
美国 1994 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映
中国大陆 1993 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港
每一个索引都是一个元组
1
df.index[0]
('美国', 1994)

获取所有的美国电影,由于产地信息已经变成了索引,因此可以用loc方法

1
df.loc['美国'].head()
Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
年代
1994 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节
1957 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国
1994 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映
2012 5 泰坦尼克号 157074 剧情/爱情/灾难 2012-04-10 00:00:00 194 9.4 中国大陆
1993 6 辛德勒的名单 306904 剧情/历史/战争 1993-11-30 00:00:00 195 9.4 华盛顿首映

这样做最大的好处就是我们可以简化很多的筛选环节

索引交换 swaplevel
1
2
df=df.swaplevel('产地','年代')
df.head()
Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
年代 产地
1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节
1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国
1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利
1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映
1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港

取消层次化索引

1
df=df.reset_index()
1
df.head()
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港
(2)数据旋转

行列转化

1
2
data=df[:5]
data
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港

T 可以直接让数据的行和列进行交换

1
data.T
0 1 2 3 4
年代 1994 1957 1997 1994 1993
产地 美国 美国 意大利 美国 中国大陆
Unnamed: 0 0 1 2 3 4
名字 肖申克的救赎 控方证人 美丽人生 阿甘正传 霸王别姬
投票人数 692795 42995 327855 580897 478523
类型 剧情/犯罪 剧情/悬疑/犯罪 剧情/喜剧/爱情 剧情/爱情 剧情/爱情/同性
上映时间 1994-09-10 00:00:00 1957-12-17 00:00:00 1997-12-20 00:00:00 1994-06-23 00:00:00 1993-01-01 00:00:00
时长 142 116 116 142 171
评分 9.6 9.5 9.5 9.4 9.4
首映地点 多伦多电影节 美国 意大利 洛杉矶首映 香港

dataframe也可以使用stack和unstack,转化为层次索引的Series

1
data.stack()
0  年代                           1994
   产地                             美国
   Unnamed: 0                      0
   名字                         肖申克的救赎
   投票人数                       692795
   类型                          剧情/犯罪
   上映时间          1994-09-10 00:00:00
   时长                            142
   评分                            9.6
   首映地点                       多伦多电影节
1  年代                           1957
   产地                             美国
   Unnamed: 0                      1
   名字                           控方证人
   投票人数                        42995
   类型                       剧情/悬疑/犯罪
   上映时间          1957-12-17 00:00:00
   时长                            116
   评分                            9.5
   首映地点                           美国
2  年代                           1997
   产地                            意大利
   Unnamed: 0                      2
   名字                          美丽人生 
   投票人数                       327855
   类型                       剧情/喜剧/爱情
   上映时间          1997-12-20 00:00:00
   时长                            116
   评分                            9.5
   首映地点                          意大利
3  年代                           1994
   产地                             美国
   Unnamed: 0                      3
   名字                           阿甘正传
   投票人数                       580897
   类型                          剧情/爱情
   上映时间          1994-06-23 00:00:00
   时长                            142
   评分                            9.4
   首映地点                        洛杉矶首映
4  年代                           1993
   产地                           中国大陆
   Unnamed: 0                      4
   名字                           霸王别姬
   投票人数                       478523
   类型                       剧情/爱情/同性
   上映时间          1993-01-01 00:00:00
   时长                            171
   评分                            9.4
   首映地点                           香港
dtype: object
1
data.stack().unstack()
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 9.6 多伦多电影节
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 9.5 美国
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 116 9.5 意大利
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 142 9.4 洛杉矶首映
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 171 9.4 香港

3.3.2 数据分组、分组运算

GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表

按照电影产地进行分组

先定义一个分组变量group

1
group=df.groupby(df['产地'])
1
group
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002238D9028B0>

可以计算分组后的各个统计量

1
group.mean().head()
年代 Unnamed: 0 投票人数 时长 评分
产地
中国台湾 1999.009709 19350.590615 8474.864078 87.257282 7.066667
中国大陆 2004.599684 20391.791426 10898.293793 81.432930 6.064703
中国香港 1991.100316 19230.117152 8167.446159 88.541214 6.474114
丹麦 1999.090909 20415.611111 1993.858586 88.101010 7.245960
俄罗斯 1992.534129 20061.753479 2098.813784 93.280981 7.310736

计算每年的平均评分

1
df['评分'].groupby(df['年代']).mean().head()
年代
1888    7.950000
1890    4.800000
1892    7.500000
1894    6.633333
1895    7.575000
Name: 评分, dtype: float64

只会对数值变量进行分组运算

1
df['年代']=df['年代'].astype('str')
1
df.groupby(df['产地']).mean().head()
Unnamed: 0 投票人数 时长 评分
产地
中国台湾 19350.590615 8474.864078 87.257282 7.066667
中国大陆 20391.791426 10898.293793 81.432930 6.064703
中国香港 19230.117152 8167.446159 88.541214 6.474114
丹麦 20415.611111 1993.858586 88.101010 7.245960
俄罗斯 20061.753479 2098.813784 93.280981 7.310736

我们也可以传入多个分组变量

1
df.groupby([df['产地'],df['年代']]).mean().head()
Unnamed: 0 投票人数 时长 评分
产地 年代
中国台湾 1963 14805.0 121.000000 113.0 6.4
1965 30282.0 153.666667 105.0 6.8
1966 26305.0 51.000000 60.0 7.9
1967 16605.0 4444.000000 112.0 8.0
1968 21282.5 89.000000 83.0 7.4

获得每个地区,每一年的电影的评分的均值

1
df['评分'].groupby([df['产地'],df['年代']]).mean()
产地    年代  
中国台湾  1963    6.400000
      1965    6.800000
      1966    7.900000
      1967    8.000000
      1968    7.400000
                ...   
韩国    2012    6.064151
      2013    6.098198
      2014    5.650833
      2015    5.423853
      2016    5.730000
Name: 评分, Length: 1511, dtype: float64
Series通过unstack方法转化为dataframe——会产生缺失值
1
df['评分'].groupby([df['产地'],df['年代']]).mean().unstack().head()
年代 1888 1890 1892 1894 1895 1896 1897 1898 1899 1900 ... 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
产地
中国台湾 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 7.420000 7.100000 7.053846 7.231818 6.556098 7.076471 6.522222 6.576000 NaN NaN
中国大陆 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 6.589726 6.536628 6.357831 5.824606 5.727187 5.316667 4.963757 4.969189 4.712000 NaN
中国香港 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 6.476786 6.442553 6.245455 5.971053 6.110526 6.105714 5.616667 5.589189 5.390909 NaN
丹麦 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 7.050000 7.118182 7.362500 7.016667 7.418750 6.555556 7.120000 7.166667 7.000000 NaN
俄罗斯 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 7.024468 6.922727 6.974324 7.006000 6.784127 6.890566 6.965957 7.089655 NaN NaN

5 rows × 127 columns

3.3.3 离散化处理

再实际的数据分析项目中,对有的数据属性,我们往往并不关注数据的绝对取值,只关注它所处的区间或等级。

比如我们可以把评分9分及以上定义为A,7-9分为B,5-7分为C,3-5分为D,小于3分的为E。

离散化也可以称为分组、区间化 Pandas为我们提供了方便的函数cut():
pd.cut (x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
参数:
x:需要离散化的数组、Series、DataFrame对象
bins:分组的依据
right=True:默认包括右端点
include_lowest=False:默认不包括左端点
labels:是否要用标记替换分组
retbins:返回x中对应的bins的列表
precision:精度
1
2
df['评分等级']=pd.cut(df['评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])
df
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.600000 多伦多电影节 A
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.500000 美国 A
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.500000 意大利 A
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.400000 洛杉矶首映 A
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.400000 香港 A
... ... ... ... ... ... ... ... ... ... ... ...
38725 1935 美国 38728 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国 B
38726 1986 中国大陆 38729 血溅画屏 95 剧情/悬疑/犯罪/武侠/古装 1905-06-08 00:00:00 91 7.100000 美国 B
38727 1986 中国大陆 38730 魔窟中的幻想 51 惊悚/恐怖/儿童 1905-06-08 00:00:00 78 8.000000 美国 B
38728 1977 俄罗斯 38731 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32 剧情/战争 1905-05-30 00:00:00 97 6.600000 美国 C
38729 2017 美国 38732 复仇者联盟3 123456 剧情/科幻 2017-05-04 00:00:00 142 6.935704 美国 C

38730 rows × 11 columns

根据投票人数来刻画电影的热门
投票人数越多,热门程度越高 使用 np.percentile 进行分位数计算
1
bins=np.percentile(df['投票人数'],[0,20,40,60,80,100])
1
df['热门程度']=pd.cut(df['投票人数'],bins,labels=['E','D','C','B','A'])
1
df
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.600000 多伦多电影节 A A
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.500000 美国 A A
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.500000 意大利 A A
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.400000 洛杉矶首映 A A
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.400000 香港 A A
... ... ... ... ... ... ... ... ... ... ... ... ...
38725 1935 美国 38728 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国 B E
38726 1986 中国大陆 38729 血溅画屏 95 剧情/悬疑/犯罪/武侠/古装 1905-06-08 00:00:00 91 7.100000 美国 B D
38727 1986 中国大陆 38730 魔窟中的幻想 51 惊悚/恐怖/儿童 1905-06-08 00:00:00 78 8.000000 美国 B E
38728 1977 俄罗斯 38731 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32 剧情/战争 1905-05-30 00:00:00 97 6.600000 美国 C E
38729 2017 美国 38732 复仇者联盟3 123456 剧情/科幻 2017-05-04 00:00:00 142 6.935704 美国 C A

38730 rows × 12 columns

大烂片:投票人数多,评分低

1
df[(df.热门程度=='A')&(df.评分等级=='E')]
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
655 2011 中国大陆 655 B区 5187 剧情/惊悚/恐怖 2011-06-03 00:00:00 89 2.3 中国大陆 E A
4376 2014 中国大陆 4376 怖偶 4867 悬疑/惊悚 2014-05-07 00:00:00 88 2.8 中国大陆 E A
5413 2011 中国大陆 5413 床下有人 4309 悬疑/惊悚 2011-10-14 00:00:00 100 2.8 中国大陆 E A
6802 2013 中国大陆 6802 帝国秘符 4351 动作/冒险 2013-09-18 00:00:00 93 3.0 中国大陆 E A
8232 2011 中国大陆 8232 飞天 4764 剧情 2011-07-01 00:00:00 115 2.9 中国大陆 E A
8406 2014 中国大陆 8406 分手达人 3937 喜剧/爱情 2014-06-06 00:00:00 90 2.7 中国大陆 E A
9601 2012 中国大陆 9601 孤岛惊魂 2982 悬疑/惊悚/恐怖 2013-01-26 00:00:00 93 2.8 中国大陆 E A
10513 2013 中国大陆 10513 海天盛宴·韦口 3788 情色 2013-10-12 00:00:00 88 2.9 网络 E A
16799 2013 中国大陆 16799 孪生密码 6390 动作/悬疑 2013-11-08 00:00:00 96 2.9 中国大陆 E A
21533 2010 日本 21536 拳皇 6329 动作/科幻/冒险 2012-10-12 00:00:00 93 3.0 中国大陆 E A
22705 2013 中国大陆 22708 闪魂 3119 惊悚/犯罪 2014-02-21 00:00:00 94 2.6 中国大陆 E A
22883 2015 中国大陆 22886 少年毛泽东 3058 动画/儿童/冒险 2015-04-30 00:00:00 76 2.4 中国大陆 E A
24128 2013 英国 24131 史前怪兽 3543 动作/惊悚/冒险 2014-01-01 00:00:00 89 3.0 中国大陆 E A
28261 2011 中国大陆 28264 无极限之危情速递 6319 喜剧/动作/爱情/冒险 2011-08-12 00:00:00 94 2.8 中国大陆 E A
32098 2010 中国大陆 32101 异度公寓 3639 惊悚 2010-06-04 00:00:00 93 2.7 中国大陆 E A
32491 2014 中国大陆 32494 英雄之战 8359 动作/爱情 2014-03-21 00:00:00 90 3.0 中国大陆 E A
32664 2013 中国大陆 32667 咏春小龙 8861 剧情/动作 2013-07-20 00:00:00 90 3.0 中国大陆 E A
33488 2014 中国大陆 33491 再爱一次好不好 6999 喜剧/爱情 2014-04-11 00:00:00 94 3.0 中国大陆 E A
38657 2014 中国大陆 38660 大话天仙 21629 喜剧/奇幻/古装 2014-02-02 00:00:00 91 3.0 中国大陆 E A
38659 2013 中国大陆 38662 天机·富春山居图 74709 动作/冒险 2013-06-09 00:00:00 122 2.9 中国大陆 E A
38660 2014 中国大陆 38663 特工艾米拉 10852 动作/悬疑 2014-04-11 00:00:00 96 2.7 中国大陆 E A
38664 2015 中国大陆 38667 汽车人总动员 12892 喜剧/动画/冒险 2015-07-03 00:00:00 85 2.3 中国大陆 E A
38669 2016 中国大陆 38672 2016年中央电视台春节 17328 歌舞/真人秀 2016-02-07 00:00:00 280 2.3 中国大陆 E A
38675 2014 中国大陆 38678 放手爱 29254 喜剧/爱情 2014-04-30 00:00:00 93 2.3 中国大陆 E A

冷门高分电影

1
df[(df.热门程度=='E')&(df.评分等级=='A')]
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
456 2015 美国 456 未知电影 45 音乐 2015-12-14 00:00:00 60 9.3 美国 A E
587 2011 英国 587 BBC喜剧音 38 喜剧/音乐/歌舞 2011-08-13 00:00:00 95 9.3 美国 A E
642 2003 美国 642 未知电影 38 纪录片/音乐 2003-02-03 00:00:00 55 9.2 美国 A E
686 2014 英国 686 未知电影 63 音乐/舞台艺术 2014-05-18 00:00:00 49 9.5 美国 A E
698 2008 英国 698 未知电影 52 纪录片 2008-07-25 00:00:00 40 9.8 美国 A E
... ... ... ... ... ... ... ... ... ... ... ... ...
37579 1986 英国 37582 歌唱神探 36 剧情/悬疑/歌舞 1986-11-16 00:00:00 415 9.1 美国 A E
37705 1972 美国 37708 未知电影 56 纪录片 1972-12-23 00:00:00 70 9.3 美国 A E
38111 1975 美国 38114 山那边 70 剧情 1975-11-14 00:00:00 103 9.1 美国 A E
38444 2015 美国 38447 62 纪录片/短片 2015-08-19 00:00:00 9 9.1 纽约电影论坛 A E
38500 2007 英国 38503 未知电影 41 纪录片/短片 1905-06-29 00:00:00 57 9.2 美国 A E

245 rows × 12 columns

将处理的数据保存

1
df.to_excel('movies_data3.xlsx')

3.3.4 合并数据集

(1)append

先把数据集拆分为多个,再进行合并

1
2
df_usa=df[df.产地=='美国']
df_cn=df[df.产地=='中国大陆']
1
df_cn.append(df_usa)
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.400000 香港 A A
21 1961 中国大陆 21 大闹天宫 74881 动画/奇幻 1905-05-14 00:00:00 114 9.200000 上集 A A
29 2015 中国大陆 29 穹顶之下 51113 纪录片 2015-02-28 00:00:00 104 9.200000 中国大陆 A A
38 1982 中国大陆 38 茶馆 10678 剧情/历史 1905-06-04 00:00:00 118 9.200000 美国 A A
45 1988 中国大陆 45 山水情 10781 动画/短片 1905-06-10 00:00:00 19 9.200000 美国 A A
... ... ... ... ... ... ... ... ... ... ... ... ...
38718 1987 美国 38721 零下的激情 199 剧情/爱情/犯罪 1987-11-06 00:00:00 98 7.400000 美国 B D
38720 1986 美国 38723 离别秋波 240 剧情/爱情/音乐 1986-02-19 00:00:00 90 8.200000 美国 B C
38723 1986 美国 38726 极乐森林 45 纪录片 1986-09-14 00:00:00 90 8.100000 美国 B E
38725 1935 美国 38728 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国 B E
38729 2017 美国 38732 复仇者联盟3 123456 剧情/科幻 2017-05-04 00:00:00 142 6.935704 美国 C A

15781 rows × 12 columns

(2)merge

pd.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(‘_x’,’_y’), copy=True, indicator=False)

left:对象

right:另一个对象

on:要加入的列。必须在左、右综合对象中找到。如果不能通过,left_index和right_index是假,将推断DataFrame中的列的交叉点为连接键

left_on:从左边的综合使用作为键列。可以是列名或数组的长度等于长度综合。

right_on:从右边的综合使用作为键列。可以是列名或数组的长度等于长度综合。

left_index:如果为True,则使用索引(行标签)从左综合作为其连接键。在与多重(层次)的综合,级别数必须匹配连接键从右综合的数目。

right_index:先沟通用法作为正确综合left_index。

how:之一‘左’,‘右’,‘外在’,‘内部’。默认为内联。

sort:综合通过连接键按字典顺序对结果进行排序。默认为True,设置为False在大多数情况下将提高性能。

suffixes:字符串后缀并不适用于重叠列的元组。默认为(’_x’,’_y’)

copy:即使重新索引是不必要总是从传递的综合对象,赋值的数据(默认为True)。在许多情况下不能避免,但可能会提高性能/内存使用情况,可以避免赋值上述案件有些病理,但尽管如此提供此选项。

indicator:将列添加到输出综合呼吁_merge与信息源的每一行。_merge是绝对类型,并对观测其合并键只出现在‘左’的综合,关策其合并键只会出现在‘正确’的综合,和两个如果观测合并关键发现在两个 right_only left_only 的值。

选取6部热门电影进行操作

1
2
df1=df.loc[:5]
df1
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节 A A
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国 A A
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利 A A
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映 A A
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港 A A
5 2012 美国 5 泰坦尼克号 157074 剧情/爱情/灾难 2012-04-10 00:00:00 194 9.4 中国大陆 A A
1
2
3
df2=df.loc[:5][['名字','产地']]
df2['票房']=[111,222,333,444,555,666]
df2
名字 产地 票房
0 肖申克的救赎 美国 111
1 控方证人 美国 222
2 美丽人生 意大利 333
3 阿甘正传 美国 444
4 霸王别姬 中国大陆 555
5 泰坦尼克号 美国 666
1
2
3
##打乱样本
df2=df2.sample(frac=1)
df2
名字 产地 票房
0 肖申克的救赎 美国 111
5 泰坦尼克号 美国 666
4 霸王别姬 中国大陆 555
2 美丽人生 意大利 333
1 控方证人 美国 222
3 阿甘正传 美国 444
1
2
3
## 重新设置索引
df2.index=range(len(df2))
df2
名字 产地 票房
0 肖申克的救赎 美国 111
1 泰坦尼克号 美国 666
2 霸王别姬 中国大陆 555
3 美丽人生 意大利 333
4 控方证人 美国 222
5 阿甘正传 美国 444

对df1和df2进行合并

1
pd.merge(df1,df2,how='inner',on='名字')
年代 产地_x Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度 产地_y 票房
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节 A A 美国 111
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国 A A 美国 222
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利 A A 意大利 333
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映 A A 美国 444
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港 A A 中国大陆 555
5 2012 美国 5 泰坦尼克号 157074 剧情/爱情/灾难 2012-04-10 00:00:00 194 9.4 中国大陆 A A 美国 666

两个样本都有 产地 列,所以会有两个产地列

(3)concat

将多个数据集进行批量合并

1
2
3
df1=df[:5]
df2=df[100:105]
df3=df[200:205]
1
2
3
print(df1)
print(df2)
print(df3)
     年代    产地  Unnamed: 0      名字    投票人数        类型                 上映时间   时长  \
0  1994    美国           0  肖申克的救赎  692795     剧情/犯罪  1994-09-10 00:00:00  142   
1  1957    美国           1    控方证人   42995  剧情/悬疑/犯罪  1957-12-17 00:00:00  116   
2  1997   意大利           2   美丽人生   327855  剧情/喜剧/爱情  1997-12-20 00:00:00  116   
3  1994    美国           3    阿甘正传  580897     剧情/爱情  1994-06-23 00:00:00  142   
4  1993  中国大陆           4    霸王别姬  478523  剧情/爱情/同性  1993-01-01 00:00:00  171   

    评分    首映地点 评分等级 热门程度  
0  9.6  多伦多电影节    A    A  
1  9.5      美国    A    A  
2  9.5     意大利    A    A  
3  9.4   洛杉矶首映    A    A  
4  9.4      香港    A    A  
       年代  产地  Unnamed: 0          名字    投票人数        类型                 上映时间  \
100  1993  韩国         100         101     146     喜剧/爱情  1993-06-19 00:00:00   
101  1995  英国         101          10     186        喜剧  1995-01-25 00:00:00   
102  2013  韩国         102          素媛  114819     剧情/家庭  2013-10-02 00:00:00   
103  2003  美国         103  101忠狗续集:伦敦     924  喜剧/动画/家庭  2003-01-21 00:00:00   
104  2000  美国         104          10    9514     喜剧/家庭  2000-09-22 00:00:00   

      时长   评分 首映地点 评分等级 热门程度  
100  112  7.4   韩国    B    D  
101  101  7.4   美国    B    D  
102  123  9.1   韩国    A    A  
103   70  7.5   美国    B    B  
104  100  7.0   美国    C    A  
       年代    产地  Unnamed: 0              名字   投票人数        类型  \
200  2014    日本         200  最完美的离婚 2014特别篇  18478  剧情/喜剧/爱情   
201  2009    日本         201          2001夜物     84     剧情/动画   
202  2009  中国香港         202            头七 頭   7039        恐怖   
203  1896    法国         203          火车进站 L   7001    纪录片/短片   
204  2009    美国         204            银行舞蹈   6944        短片   

                    上映时间   时长   评分 首映地点 评分等级 热门程度  
200  2014-02-08 00:00:00  120  9.1   日本    A    A  
201  2009-10-02 00:00:00   80  6.6   美国    C    D  
202  2009-05-21 00:00:00   60  6.2   美国    C    A  
203           1896-01-06   60  8.8   法国    B    A  
204  1905-07-01 00:00:00   60  7.8   美国    B    A  
1
2
dff=pd.concat([df1,df2,df3],axis=0) ##默认axis=0 增加行数,axis=1增加列数
dff
年代 产地 Unnamed: 0 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
0 1994 美国 0 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节 A A
1 1957 美国 1 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国 A A
2 1997 意大利 2 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利 A A
3 1994 美国 3 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映 A A
4 1993 中国大陆 4 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港 A A
100 1993 韩国 100 101 146 喜剧/爱情 1993-06-19 00:00:00 112 7.4 韩国 B D
101 1995 英国 101 10 186 喜剧 1995-01-25 00:00:00 101 7.4 美国 B D
102 2013 韩国 102 素媛 114819 剧情/家庭 2013-10-02 00:00:00 123 9.1 韩国 A A
103 2003 美国 103 101忠狗续集:伦敦 924 喜剧/动画/家庭 2003-01-21 00:00:00 70 7.5 美国 B B
104 2000 美国 104 10 9514 喜剧/家庭 2000-09-22 00:00:00 100 7.0 美国 C A
200 2014 日本 200 最完美的离婚 2014特别篇 18478 剧情/喜剧/爱情 2014-02-08 00:00:00 120 9.1 日本 A A
201 2009 日本 201 2001夜物 84 剧情/动画 2009-10-02 00:00:00 80 6.6 美国 C D
202 2009 中国香港 202 头七 頭 7039 恐怖 2009-05-21 00:00:00 60 6.2 美国 C A
203 1896 法国 203 火车进站 L 7001 纪录片/短片 1896-01-06 60 8.8 法国 B A
204 2009 美国 204 银行舞蹈 6944 短片 1905-07-01 00:00:00 60 7.8 美国 B A