python数据分析之Pandas(3)

数学建模自用

python数据分析之Pandas(3)

导入包

import pandas as pd
import numpy as np

读入数据

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

3.1 数据重塑和轴向旋转

(1)层次化索引

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

Series的层次化索引:

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

s.index

MultiIndex([(‘a’, 1),
(‘a’, 2),
(‘a’, 3),
(‘b’, 1),
(‘b’, 2),
(‘c’, 3),
(‘c’, 1),
(‘d’, 2),
(‘d’, 3)],
)

s['a'] #外层索引

1 1
2 2
3 3
dtype: int32

s['a':'c'] #切片

a 1 1
2 2
3 3
b 1 4
2 5
c 3 6
1 7
dtype: int32

s[:,1] #内层索引

a 1
b 4
c 7
dtype: int32

s['c',3] #提取具体的值

6

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

s.unstack()
123
a1.02.03.0
b4.05.0NaN
c7.0NaN6.0
dNaN8.09.0
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来说,行和列都能进行层次化索引。

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
AB
ZXC
a1012
2345
b1678
291011
data['A']
ZX
a101
234
b167
2910
data.index.names = ["row1","row2"]
data.columns.names = ["col1", "col2"]
data
col1AB
col2ZXC
row1row2
a1012
2345
b1678
291011
data.swaplevel("row1","row2") #位置调整
col1AB
col2ZXC
row2row1
1a012
2a345
1b678
2b91011

了解了层次化索引的基本知识之后,我们试着将电影数据也处理成一种多层索引的结构。

df.index #默认索引

Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

38153, 38154, 38155, 38156, 38157, 38158, 38159, 38160, 38161, 38162],
dtype=‘int64’, length=38163)

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

set_index可以把列变成索引
reset_index是把索引变成列
df = df.set_index(["产地", "年代"])
df
名字投票人数类型上映时间时长评分首映地点
产地年代
美国1994肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.600000多伦多电影节
1957控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.500000美国
意大利1997美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.500000意大利
美国1994阿甘正传580897剧情/爱情1994-06-23 00:00:001429.400000洛杉矶首映
中国大陆1993霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.400000香港
...........................
美国19351935年57喜剧/歌舞1935-03-15 00:00:00987.600000美国
中国大陆1986血溅画屏95剧情/悬疑/犯罪/武侠/古装1905-06-08 00:00:00917.100000美国
1986魔窟中的幻想51惊悚/恐怖/儿童1905-06-08 00:00:00788.000000美国
俄罗斯1977列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32剧情/战争1905-05-30 00:00:00976.600000美国
美国2018复仇者联盟3123456剧情/科幻2018-05-04 00:00:001426.935704美国

38163 rows × 7 columns

每一个索引都是一个元组

df.index[0]

(‘美国’, 1994)

获取所有的美国电影,由于产地信息已经变成了索引,因此要是用.loc方法。
df.loc["美国"] #行标签索引行数据,注意索引多行时两边都是闭区间
名字投票人数类型上映时间时长评分首映地点
年代
1994肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.600000多伦多电影节
1957控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.500000美国
1994阿甘正传580897剧情/爱情1994-06-23 00:00:001429.400000洛杉矶首映
2012泰坦尼克号157074剧情/爱情/灾难2012-04-10 00:00:001949.400000中国大陆
1993辛德勒的名单306904剧情/历史/战争1993-11-30 00:00:001959.400000华盛顿首映
........................
1987零下的激情199剧情/爱情/犯罪1987-11-06 00:00:00987.400000美国
1986离别秋波240剧情/爱情/音乐1986-02-19 00:00:00908.200000美国
1986极乐森林45纪录片1986-09-14 00:00:00908.100000美国
19351935年57喜剧/歌舞1935-03-15 00:00:00987.600000美国
2018复仇者联盟3123456剧情/科幻2018-05-04 00:00:001426.935704美国

11714 rows × 7 columns

df.loc["中国大陆"]
名字投票人数类型上映时间时长评分首映地点
年代
1993霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港
1961大闹天宫74881动画/奇幻1905-05-14 00:00:001149.2上集
2015穹顶之下51113纪录片2015-02-28 00:00:001049.2中国大陆
1982茶馆10678剧情/历史1905-06-04 00:00:001189.2美国
1988山水情10781动画/短片1905-06-10 00:00:00199.2美国
........................
1986T省的八四、八五380剧情1905-06-08 00:00:00948.7美国
1986失踪的女中学生101儿童1905-06-08 00:00:001027.4美国
1986血战台儿庄2908战争1905-06-08 00:00:001208.1美国
1986血溅画屏95剧情/悬疑/犯罪/武侠/古装1905-06-08 00:00:00917.1美国
1986魔窟中的幻想51惊悚/恐怖/儿童1905-06-08 00:00:00788.0美国

3791 rows × 7 columns

这样做的最大好处是我们可以简化很多的筛选环节
每一个索引是一个元组
df = df.swaplevel("产地", "年代") #调换标签顺序
df
名字投票人数类型上映时间时长评分首映地点
年代产地
1994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.600000多伦多电影节
1957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.500000美国
1997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.500000意大利
1994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.400000洛杉矶首映
1993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.400000香港
...........................
1935美国1935年57喜剧/歌舞1935-03-15 00:00:00987.600000美国
1986中国大陆血溅画屏95剧情/悬疑/犯罪/武侠/古装1905-06-08 00:00:00917.100000美国
中国大陆魔窟中的幻想51惊悚/恐怖/儿童1905-06-08 00:00:00788.000000美国
1977俄罗斯列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32剧情/战争1905-05-30 00:00:00976.600000美国
2018美国复仇者联盟3123456剧情/科幻2018-05-04 00:00:001426.935704美国

38163 rows × 7 columns

df.loc[1994]
名字投票人数类型上映时间时长评分首映地点
产地
美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节
美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映
法国这个杀手不太冷662552剧情/动作/犯罪1994-09-14 00:00:001339.4法国
美国34街的768剧情/家庭/奇幻1994-12-23 00:00:001147.9美国
中国大陆活着202794剧情/家庭1994-05-18 00:00:001329.0法国
........................
美国鬼精灵2: 恐怖60喜剧/恐怖/奇幻1994-04-08 00:00:00855.8美国
英国黑色第1644剧情/惊悚1996-02-01 00:00:001066.8美国
日本蜡笔小新之布里布里王国的秘密宝藏 クレヨンしんちゃん ブリブリ王国の2142动画1994-04-23 00:00:00947.7日本
日本龙珠Z剧场版10:两人面临危机! 超战士难以成眠 ドラゴンボール Z 劇場版:危険なふたり!579动画1994-03-12 00:00:00537.2美国
中国香港重案实录之惊天械劫案 重案實錄之驚天械劫90动作/犯罪1905-06-16 00:00:001147.3美国

489 rows × 7 columns

取消层次化索引

df = df.reset_index()
df[:5]
年代产地名字投票人数类型上映时间时长评分首映地点
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港

(2)数据旋转

行列转化:以前5部电影为例

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

.T可以直接让数据的行列进行交换(转置)

data.T
01234
年代19941957199719941993
产地美国美国意大利美国中国大陆
名字肖申克的救赎控方证人美丽人生阿甘正传霸王别姬
投票人数69279542995327855580897478523
类型剧情/犯罪剧情/悬疑/犯罪剧情/喜剧/爱情剧情/爱情剧情/爱情/同性
上映时间1994-09-10 00:00:001957-12-17 00:00:001997-12-20 00:00:001994-06-23 00:00:001993-01-01 00:00:00
时长142116116142171
评分9.69.59.59.49.4
首映地点多伦多电影节美国意大利洛杉矶首映香港

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

data.stack()

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

data.stack().unstack()  #转回来
年代产地名字投票人数类型上映时间时长评分首映地点
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港

3.2 数据分组,分组运算

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

按照电影的产地进行分组

group = df.groupby(df["产地"])

先定义一个分组变量group

type(group)

pandas.core.groupby.generic.DataFrameGroupBy

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

group.mean(numeric_only = True) #只对数值变量做统计
年代投票人数时长评分
产地
中国台湾1999.0097098474.86407887.2572827.066667
中国大陆2004.58243210915.58770881.5170146.062991
中国香港1991.0888658141.70987088.5532146.473551
丹麦1999.0913712003.78172688.5076147.246701
俄罗斯1984.8928571021.18067296.1008407.557143
其他1998.7217211619.14445087.6563997.226713
加拿大2002.5204511921.83497980.5923846.727221
印度2006.0393263219.587079120.9494386.864888
墨西哥1992.7863251191.98290692.6410267.085470
巴西1999.8888893606.33333388.3737377.232323
德国1996.0538692624.73653392.2585707.187365
意大利1985.5991903374.955466104.3333337.183131
日本1999.8865363592.01578185.0105877.192569
比利时1999.5036501244.15328583.0656937.197080
法国1991.7940443663.06638090.2490137.243093
波兰1987.027624881.64088480.7348077.441989
泰国2009.1292525322.72449088.4421776.109184
澳大利亚2002.9661024798.11186485.5932206.953559
瑞典1987.1069521549.70053594.6256687.425668
美国1994.5198918677.29486189.9760976.923351
英国1996.6309264979.83784889.2133187.498420
荷兰2001.198675957.58940475.8874177.160265
西班牙2001.5462753355.26636690.9051927.025056
阿根廷2004.2123892283.93805392.5486737.248673
韩国2008.1020866527.518629100.0186296.351118
group.sum(numeric_only = True)
年代投票人数时长评分
产地
中国台湾12353885237466539254367.200000
中国大陆75993724138099330903122984.800000
中国香港56686302317944825211118430.200000
丹麦393821394745174361427.600000
俄罗斯944809486082457443597.200000
其他3763593304884916505713607.900000
加拿大14197871362581571404769.600000
印度7141501146173430582443.900000
墨西哥23315613946210839829.000000
巴西1979893570278749716.000000
德国20379712679856941967338.300000
意大利14713292500842773115322.700000
日本100114321798163142556336006.000000
比利时27393217044911380986.000000
法国55511301020896625152420186.500000
波兰359652159577146131347.000000
泰国5906841564881260021796.100000
澳大利亚5908751415443252502051.300000
瑞典371589289794176951388.600000
美国23363806101645832105398081100.135704
英国53070451323640923712919930.800000
荷兰302181144596114591081.200000
西班牙8866851486383402713112.100000
阿根廷22647625808510458819.100000
韩国269487387599301342258523.200000

计算每年的平均评分

df["评分"].groupby(df["年代"]).mean()

年代
1888 7.950000
1890 4.800000
1892 7.500000
1894 6.633333
1895 7.575000

2013 6.375974
2014 6.249384
2015 6.121925
2016 5.834524
2018 6.935704
Name: 评分, Length: 127, dtype: float64

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

df.groupby([df["产地"],df["年代"]]).mean(numeric_only = True) #根据两个变量进行分组
投票人数时长评分
产地年代
中国台湾1963121.000000113.0000006.400000
1965153.666667105.0000006.800000
196651.00000060.0000007.900000
19674444.000000112.0000008.000000
196889.00000083.0000007.400000
...............
韩国20125812.542857100.7714296.035238
201310470.37037097.7314816.062037
20143776.26666798.6666675.650833
20153209.247706100.2660555.423853
20161739.850000106.1000005.730000

1578 rows × 3 columns

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

group = df["评分"].groupby([df["产地"], df["年代"]])
means = group.mean(numeric_only = True)
means

产地 年代
中国台湾 1963 6.400000
1965 6.800000
1966 7.900000
1967 8.000000
1968 7.400000

韩国 2012 6.035238
2013 6.062037
2014 5.650833
2015 5.423853
2016 5.730000
Name: 评分, Length: 1578, dtype: float64

Series通过unstack方法转化为dataframe

会产生缺失值

means.unstack().T
产地中国台湾中国大陆中国香港丹麦俄罗斯其他加拿大印度墨西哥巴西...波兰泰国澳大利亚瑞典美国英国荷兰西班牙阿根廷韩国
年代
1888NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN7.950000NaNNaNNaNNaN
1890NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaN4.800000NaNNaNNaNNaNNaN
1892NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1894NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaN6.450000NaNNaNNaNNaNNaN
1895NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
20137.0764715.3065006.1057146.5555566.8750006.8535716.0181826.4000006.9833338.00...6.9666675.5680006.760007.1006.3082557.4601406.336.3583336.6166676.062037
20146.5222224.9638305.6166677.1200007.1750006.5962505.9217396.3741947.2500006.86...7.0600005.6535716.568756.9606.3930567.2533987.306.8687507.1500005.650833
20156.5760004.9691895.5891897.1666677.3428576.7327276.0187506.7363646.5000006.76...6.3000005.8466676.880007.6256.2314867.1232566.706.5142867.2333335.423853
2016NaN4.7120005.3909097.000000NaN6.8333336.2000006.900000NaNNaN...NaNNaNNaNNaN6.5225817.200000NaNNaNNaN5.730000
2018NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaN6.935704NaNNaNNaNNaNNaN

127 rows × 25 columns

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精度。

df["评分等级"] = pd.cut(df["评分"], [0,3,5,7,9,10], labels = ['E','D','C','B','A']) #labels要和区间划分一一对应
df
年代产地名字投票人数类型上映时间时长评分首映地点评分等级
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.600000多伦多电影节A
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.500000美国A
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.500000意大利A
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.400000洛杉矶首映A
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.400000香港A
.................................
381581935美国1935年57喜剧/歌舞1935-03-15 00:00:00987.600000美国B
381591986中国大陆血溅画屏95剧情/悬疑/犯罪/武侠/古装1905-06-08 00:00:00917.100000美国B
381601986中国大陆魔窟中的幻想51惊悚/恐怖/儿童1905-06-08 00:00:00788.000000美国B
381611977俄罗斯列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32剧情/战争1905-05-30 00:00:00976.600000美国C
381622018美国复仇者联盟3123456剧情/科幻2018-05-04 00:00:001426.935704美国C

38163 rows × 10 columns

同样的,我们可以根据投票人数来刻画电影的热门

投票越多的热门程度越高

bins = np.percentile(df["投票人数"], [0,20,40,60,80,100]) #获取分位数
df["热门程度"] = pd.cut(df["投票人数"],bins,labels = ['E','D','C','B','A'])
df[:5]
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节AA
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国AA
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利AA
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映AA
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港AA

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

遗憾的是,我们可以发现,烂片几乎都是中国大陆的

df[(df.热门程度 == 'A') & (df.评分等级 == 'E')]
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
6232011中国大陆B区5187剧情/惊悚/恐怖2011-06-03 00:00:00892.3中国大陆EA
41672014中国大陆怖偶4867悬疑/惊悚2014-05-07 00:00:00882.8中国大陆EA
52002011中国大陆床下有人4309悬疑/惊悚2011-10-14 00:00:001002.8中国大陆EA
65852013中国大陆帝国秘符4351动作/冒险2013-09-18 00:00:00933.0中国大陆EA
80092011中国大陆飞天4764剧情2011-07-01 00:00:001152.9中国大陆EA
81812014中国大陆分手达人3937喜剧/爱情2014-06-06 00:00:00902.7中国大陆EA
93722012中国大陆孤岛惊魂2982悬疑/惊悚/恐怖2013-01-26 00:00:00932.8中国大陆EA
102752013中国大陆海天盛宴·韦口3788情色2013-10-12 00:00:00882.9网络EA
165122013中国大陆孪生密码6390动作/悬疑2013-11-08 00:00:00962.9中国大陆EA
211892010日本拳皇6329动作/科幻/冒险2012-10-12 00:00:00933.0中国大陆EA
223482013中国大陆闪魂3119惊悚/犯罪2014-02-21 00:00:00942.6中国大陆EA
225242015中国大陆少年毛泽东3058动画/儿童/冒险2015-04-30 00:00:00762.4中国大陆EA
237542013英国史前怪兽3543动作/惊悚/冒险2014-01-01 00:00:00893.0中国大陆EA
278322011中国大陆无极限之危情速递6319喜剧/动作/爱情/冒险2011-08-12 00:00:00942.8中国大陆EA
316222010中国大陆异度公寓3639惊悚2010-06-04 00:00:00932.7中国大陆EA
320072014中国大陆英雄之战8359动作/爱情2014-03-21 00:00:00903.0中国大陆EA
321802013中国大陆咏春小龙8861剧情/动作2013-07-20 00:00:00903.0中国大陆EA
329902014中国大陆再爱一次好不好6999喜剧/爱情2014-04-11 00:00:00943.0中国大陆EA
380902014中国大陆大话天仙21629喜剧/奇幻/古装2014-02-02 00:00:00913.0中国大陆EA
380922013中国大陆天机·富春山居图74709动作/冒险2013-06-09 00:00:001222.9中国大陆EA
380932014中国大陆特工艾米拉10852动作/悬疑2014-04-11 00:00:00962.7中国大陆EA
380972015中国大陆汽车人总动员12892喜剧/动画/冒险2015-07-03 00:00:00852.3中国大陆EA
381022016中国大陆2016年中央电视台春节17328歌舞/真人秀2016-02-07 00:00:002802.3中国大陆EA
381082014中国大陆放手爱29254喜剧/爱情2014-04-30 00:00:00932.3中国大陆EA

冷门高分电影

df[(df.热门程度 == 'E') & (df.评分等级 == 'A')]
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
5632011英国BBC喜剧音38喜剧/音乐/歌舞2011-08-13 00:00:00959.3美国AE
8952014日本JOJO的奇妙冒险 特别见面会 Walk Like Crusade36纪录片2014-10-26 00:00:001379.3美国AE
10992012英国Pond一家最45纪录片2012-09-29 00:00:00129.2美国AE
15402007英国阿森纳:温格的十一人74运动2007-10-22 00:00:00789.5美国AE
15472009英国阿斯加德远征59纪录片2011-09-17 00:00:00859.3美国AE
....................................
368462012中国大陆末了,未了34剧情/喜剧/爱情2012-12-16 00:00:00909.5美国AE
370002015中国大陆身经百战74纪录片2015-03-24 00:00:00919.1美国AE
370331986英国歌唱神探36剧情/悬疑/歌舞1986-11-16 00:00:004159.1美国AE
375571975美国山那边70剧情1975-11-14 00:00:001039.1美国AE
378832015美国62纪录片/短片2015-08-19 00:00:0099.1纽约电影论坛AE

177 rows × 11 columns

将处理后的数据进行保存

df.to_excel("movie_data3.xlsx")

3.4 合并数据集

( 1 )append

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

df_usa = df[df.产地 == "美国"]
df_china = df[df.产地 == "中国大陆"]
df_china._append(df_usa) #直接追加到后面,最好是变量相同的
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.400000香港AA
211961中国大陆大闹天宫74881动画/奇幻1905-05-14 00:00:001149.200000上集AA
292015中国大陆穹顶之下51113纪录片2015-02-28 00:00:001049.200000中国大陆AA
381982中国大陆茶馆10678剧情/历史1905-06-04 00:00:001189.200000美国AA
451988中国大陆山水情10781动画/短片1905-06-10 00:00:00199.200000美国AA
....................................
381511987美国零下的激情199剧情/爱情/犯罪1987-11-06 00:00:00987.400000美国BD
381531986美国离别秋波240剧情/爱情/音乐1986-02-19 00:00:00908.200000美国BC
381561986美国极乐森林45纪录片1986-09-14 00:00:00908.100000美国BE
381581935美国1935年57喜剧/歌舞1935-03-15 00:00:00987.600000美国BE
381622018美国复仇者联盟3123456剧情/科幻2018-05-04 00:00:001426.935704美国CA

15505 rows × 11 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, validate=None) 

left:DataFrame对象

right:DataFrame或Series(要合并的对象)

how:{‘left’, ‘right’, ‘outer’, ‘inner’},默认’inner’
(要执行的合并类型)

  • left:只使用左框架中的键,类似于SQL的左外连接;
    保留键顺序。
  • right:只使用右框架中的键,类似于SQL的右外连接;
    保留键顺序。
  • outer:使用来自两个帧的键的联合,类似于SQL的完整外层加入;
    按字典顺序排序键。
  • inner:使用两个帧的键的交集,类似于SQL inner加入;
    保持左键的顺序。

on:label或list
要连接的列或索引级别名称。这些必须在两者中找到DataFrames。如果’ on '为None并且不合并索引,则默认为到两个dataframe中列的交点。

left_on:label或list,或array-like
在左DataFrame中要连接的列或索引级别名称。也可以是左DataFrame长度的数组或数组列表。这些数组被视为列。

right_on:label或list,或array-like
要在正确的DataFrame中连接的列或索引级别名称。也可以是与DataFrame长度相同的数组或数组列表。这些数组被视为列。

left_index: bool,默认为False
使用左侧DataFrame中的索引作为连接键。如果它是MultiIndex,另一个DataFrame(或者索引)中的键数(或列数)必须与层数相匹配。

right_index: bool,默认为False
使用来自右侧DataFrame的索引作为连接键。同样的警告left_index。

sort: bool,默认为False
在结果DataFrame中按字典顺序排序连接键。如果错误,连接键的顺序取决于连接类型(how关键字)。

suffixes:tuple of (str, str), 默认值为 (‘_x’, ‘_y’)
应用于左侧和右侧重叠的列名

copy: bool,默认为True
如果为False,尽可能避免复制。

indicator: bool或str,默认为False
如果为True,则在输出DataFrame中添加一个名为“_merge”的列
每行来源的信息。
如果是字符串,则包含每行来源信息的列将被添加到
输出DataFrame,列将被命名为字符串的值。
信息列是分类类型的,其值为“left_only”
对于合并键只出现在’left DataFrame’的观测值,
'right_only’用于合并键只出现在right中的观测值
如果观测值的合并键在两者中都存在,则使用both。

Validate: str,可选
如果指定,则检查merge是否为指定类型。

  • “one_to_one"或"1:1”:检查合并键在两者中是否唯一
    left and right datasets
  • “one_to_many"或"1:m”:检查合并键在左侧是否唯一
    dataset
  • “many_to_one"或"m:1”:检查合并键是否唯一
    dataset
  • “many_to_many"或"m:m”:允许,但不检查。

我们选取6部热门电影

df1 = df.loc[:5]
df1
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节AA
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国AA
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利AA
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映AA
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港AA
52012美国泰坦尼克号157074剧情/爱情/灾难2012-04-10 00:00:001949.4中国大陆AA
df2 = df.loc[:5][["名字","产地"]]
df2["票房"] = [123344,23454,55556,333,6666,444]
df2
名字产地票房
0肖申克的救赎美国123344
1控方证人美国23454
2美丽人生意大利55556
3阿甘正传美国333
4霸王别姬中国大陆6666
5泰坦尼克号美国444
df2 = df2.sample(frac = 1) #打乱数据
df2.index = range(len(df2))
df2
名字产地票房
0肖申克的救赎美国123344
1霸王别姬中国大陆6666
2控方证人美国23454
3美丽人生意大利55556
4阿甘正传美国333
5泰坦尼克号美国444

现在,我们需要把df1和df2合并

我们发现,df2有票房数据,df1有评分等其他信息
由于样本的顺序不一致,因此不能直接采取直接复制的方法

pd.merge(df1, df2, how = "inner", on = "名字")
年代产地_x名字投票人数类型上映时间时长评分首映地点评分等级热门程度产地_y票房
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节AA美国123344
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国AA美国23454
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利AA意大利55556
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映AA美国333
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港AA中国大陆6666
52012美国泰坦尼克号157074剧情/爱情/灾难2012-04-10 00:00:001949.4中国大陆AA美国444

由于两个数据集都存在产地,因此合并后会有两个产地信息

( 3 )concat

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

df1 = df[:10]
df2 = df[100:110]
df3 = df[200:210]
dff = pd.concat([df1,df2,df3],axis = 0) #默认axis = 0,列拼接需要修改为1
dff
年代产地名字投票人数类型上映时间时长评分首映地点评分等级热门程度
01994美国肖申克的救赎692795剧情/犯罪1994-09-10 00:00:001429.6多伦多电影节AA
11957美国控方证人42995剧情/悬疑/犯罪1957-12-17 00:00:001169.5美国AA
21997意大利美丽人生327855剧情/喜剧/爱情1997-12-20 00:00:001169.5意大利AA
31994美国阿甘正传580897剧情/爱情1994-06-23 00:00:001429.4洛杉矶首映AA
41993中国大陆霸王别姬478523剧情/爱情/同性1993-01-01 00:00:001719.4香港AA
52012美国泰坦尼克号157074剧情/爱情/灾难2012-04-10 00:00:001949.4中国大陆AA
61993美国辛德勒的名单306904剧情/历史/战争1993-11-30 00:00:001959.4华盛顿首映AA
71997日本新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai24355剧情/动作/科幻/动画/奇幻1997-07-19 00:00:00879.4日本AA
82013日本银魂完结篇:直到永远的万事屋 劇場版 銀魂 完結篇 万事屋よ21513剧情/动画2013-07-06 00:00:001109.4日本AA
91994法国这个杀手不太冷662552剧情/动作/犯罪1994-09-14 00:00:001339.4法国AA
1001993韩国101146喜剧/爱情1993-06-19 00:00:001127.4韩国BD
1011995英国10186喜剧1995-01-25 00:00:001017.4美国BD
1022013韩国素媛114819剧情/家庭2013-10-02 00:00:001239.1韩国AA
1032003美国101忠狗续集:伦敦924喜剧/动画/家庭2003-01-21 00:00:00707.5美国BB
1042000美国109514喜剧/家庭2000-09-22 00:00:001007.0美国CA
1052013韩国10601剧情2014-04-24 00:00:00937.2美国BC
1062006美国10件或1770剧情/喜剧/爱情2006-12-01 00:00:00827.7美国BB
1072014美国10年1531喜剧/同性2015-06-02 00:00:00906.9美国CB
1082012日本11·25自决之日 三岛由纪夫与年轻人们 11・25自決の149剧情2012-06-02 00:00:001195.6日本CD
1091997美国泰坦尼克号535491剧情/爱情/灾难1998-04-03 00:00:001949.1中国大陆AA
2002014日本最完美的离婚 2014特别篇18478剧情/喜剧/爱情2014-02-08 00:00:001209.1日本AA
2012009日本2001夜物84剧情/动画2009-10-02 00:00:00806.6美国CD
2022009中国香港头七 頭7039恐怖2009-05-21 00:00:00606.2美国CA
2031896法国火车进站 L7001纪录片/短片1896-01-06608.8法国BA
2042009美国银行舞蹈6944短片1905-07-01 00:00:00607.8美国BA
2052003荷兰2003提雅48音乐2003-10-07 00:00:002008.9美国BE
2062012美国死亡飞车3:地狱烈6937动作2012-12-12 00:00:00605.8美国CA
2072012日本时光钟摆 振り6876剧情/动画/短片2012-03-20 00:00:00608.7美国BA
2082011中国香港你还可爱么 你還可愛6805短片2011-04-22 00:00:00608.3美国BA
2092002中国香港一碌蔗6799剧情/喜剧/爱情2002-09-19 00:00:00606.7美国CA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值