视频:课程5_哔哩哔哩_bilibili

目录

python数据分析之Pandas-3

3.1 数据重塑和轴向旋转

(1)层次化索引

Series的层次化索引:

Dataframe的层次化索引:

每一个索引都是一个元组

取消层次化索引

(2)数据旋转

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

3.2 数据分组,分组运算

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

按照电影的产地进行分组

先定义一个分组变量group

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

计算每年的平均评分

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

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

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

Series通过unstack方法转化为dataframe

会产生缺失值

3.3 离散化处理

冷门高分电影

将处理后的数据进行保存

3.4 合并数据集

( 1 )append

( 2 )merge

我们选取6部热门电影

( 3 )concat


python数据分析之Pandas-3

导入包

In [ ]:

import pandas as pd
import numpy as np

读入数据

In [ ]:

df = pd.read_excel(r'movie_data2.xlsx', index_col = 0)

In [ ]:

df[:5]

Out[ ]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
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 香港

3.1 数据重塑和轴向旋转

(1)层次化索引

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

Series的层次化索引:

In [ ]:

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 #类似于合并单元格

Out[ ]:

a  1    12    23    3
b  1    42    5
c  3    61    7
d  2    83    9
dtype: int32

In [ ]:

s.index

Out[ ]:

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

In [ ]:

s['a'] #外层索引

Out[ ]:

1    1
2    2
3    3
dtype: int32

In [ ]:

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

Out[ ]:

a  1    12    23    3
b  1    42    5
c  3    61    7
dtype: int32

In [ ]:

s[:,1] #内层索引

Out[ ]:

a    1
b    4
c    7
dtype: int32

In [ ]:

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

Out[ ]:

6

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

In [ ]:

s.unstack()

Out[ ]:

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

In [ ]:

s.unstack().stack() #形式上的相互转换

Out[ ]:

a  1    1.02    2.03    3.0
b  1    4.02    5.0
c  1    7.03    6.0
d  2    8.03    9.0
dtype: float64

Dataframe的层次化索引:

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

In [ ]:

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

Out[ ]:

A B
Z X C
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

In [ ]:

data['A']

Out[ ]:

Z X
a 1 0 1
2 3 4
b 1 6 7
2 9 10

In [ ]:

data.index.names = ["row1","row2"]
data.columns.names = ["col1", "col2"]
data

Out[ ]:

col1 A B
col2 Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

In [ ]:

data.swaplevel("row1","row2") #位置调整

Out[ ]:

col1 A B
col2 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

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

In [ ]:

df.index #默认索引

Out[ ]:

Int64Index([    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是把索引变成列

In [ ]:

df = df.set_index(["产地", "年代"])
df

Out[ ]:

名字 投票人数 类型 上映时间 时长 评分 首映地点
产地 年代
美国 1994 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.600000 多伦多电影节
1957 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.500000 美国
意大利 1997 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.500000 意大利
美国 1994 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.400000 洛杉矶首映
中国大陆 1993 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.400000 香港
... ... ... ... ... ... ... ... ...
美国 1935 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国
中国大陆 1986 血溅画屏 95 剧情/悬疑/犯罪/武侠/古装 1905-06-08 00:00:00 91 7.100000 美国
1986 魔窟中的幻想 51 惊悚/恐怖/儿童 1905-06-08 00:00:00 78 8.000000 美国
俄罗斯 1977 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32 剧情/战争 1905-05-30 00:00:00 97 6.600000 美国
美国 2018 复仇者联盟3 123456 剧情/科幻 2018-05-04 00:00:00 142 6.935704 美国

38163 rows × 7 columns

每一个索引都是一个元组

In [ ]:

df.index[0]

Out[ ]:

('美国', 1994)

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

In [ ]:

df.loc["美国"] #行标签索引行数据,注意索引多行时两边都是闭区间

Out[ ]:

名字 投票人数 类型 上映时间 时长 评分 首映地点
年代
1994 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.600000 多伦多电影节
1957 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.500000 美国
1994 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.400000 洛杉矶首映
2012 泰坦尼克号 157074 剧情/爱情/灾难 2012-04-10 00:00:00 194 9.400000 中国大陆
1993 辛德勒的名单 306904 剧情/历史/战争 1993-11-30 00:00:00 195 9.400000 华盛顿首映
... ... ... ... ... ... ... ...
1987 零下的激情 199 剧情/爱情/犯罪 1987-11-06 00:00:00 98 7.400000 美国
1986 离别秋波 240 剧情/爱情/音乐 1986-02-19 00:00:00 90 8.200000 美国
1986 极乐森林 45 纪录片 1986-09-14 00:00:00 90 8.100000 美国
1935 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国
2018 复仇者联盟3 123456 剧情/科幻 2018-05-04 00:00:00 142 6.935704 美国

11714 rows × 7 columns

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

每一个索引是一个元组

In [ ]:

df = df.swaplevel("产地", "年代") #调换标签顺序
df

Out[ ]:

名字 投票人数 类型 上映时间 时长 评分 首映地点
年代 产地
1994 美国 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.600000 多伦多电影节
1957 美国 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.500000 美国
1997 意大利 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.500000 意大利
1994 美国 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.400000 洛杉矶首映
1993 中国大陆 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.400000 香港
... ... ... ... ... ... ... ... ...
1935 美国 1935年 57 喜剧/歌舞 1935-03-15 00:00:00 98 7.600000 美国
1986 中国大陆 血溅画屏 95 剧情/悬疑/犯罪/武侠/古装 1905-06-08 00:00:00 91 7.100000 美国
中国大陆 魔窟中的幻想 51 惊悚/恐怖/儿童 1905-06-08 00:00:00 78 8.000000 美国
1977 俄罗斯 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32 剧情/战争 1905-05-30 00:00:00 97 6.600000 美国
2018 美国 复仇者联盟3 123456 剧情/科幻 2018-05-04 00:00:00 142 6.935704 美国

38163 rows × 7 columns

In [ ]:

df.loc[1994]

Out[ ]:

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

489 rows × 7 columns

取消层次化索引

In [ ]:

df = df.reset_index()
df[:5]

Out[ ]:

年代 产地 名字 投票人数 类型 上映时间 时长 评分 首映地点
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 香港

(2)数据旋转

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

In [ ]:

data = df[:5]
data

Out[ ]:

年代 产地 名字 投票人数 类型 上映时间 时长 评分 首映地点
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 香港

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

In [ ]:

data.T

Out[ ]:

0 1 2 3 4
年代 1994 1957 1997 1994 1993
产地 美国 美国 意大利 美国 中国大陆
名字 肖申克的救赎 控方证人 美丽人生 阿甘正传 霸王别姬
投票人数 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

In [ ]:

data.stack()

Out[ ]:

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

In [ ]:

data.stack().unstack()  #转回来

Out[ ]:

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

3.2 数据分组,分组运算

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

按照电影的产地进行分组

In [ ]:

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

先定义一个分组变量group

In [ ]:

type(group)

Out[ ]:

pandas.core.groupby.generic.DataFrameGroupBy

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

In [ ]:

group.mean()

Out[ ]:

年代 投票人数 时长 评分
产地
中国台湾 1999.009709 8474.864078 87.257282 7.066667
中国大陆 2004.582432 10915.587708 81.517014 6.062991
中国香港 1991.088865 8141.709870 88.553214 6.473551
丹麦 1999.091371 2003.781726 88.507614 7.246701
俄罗斯 1984.892857 1021.180672 96.100840 7.557143
其他 1998.721721 1619.144450 87.656399 7.226713
加拿大 2002.520451 1921.834979 80.592384 6.727221
印度 2006.039326 3219.587079 120.949438 6.864888
墨西哥 1992.786325 1191.982906 92.641026 7.085470
巴西 1999.888889 3606.333333 88.373737 7.232323
德国 1996.053869 2624.736533 92.258570 7.187365
意大利 1985.599190 3374.955466 104.333333 7.183131
日本 1999.886536 3592.015781 85.010587 7.192569
比利时 1999.503650 1244.153285 83.065693 7.197080
法国 1991.794044 3663.066380 90.249013 7.243093
波兰 1987.027624 881.640884 80.734807 7.441989
泰国 2009.129252 5322.724490 88.442177 6.109184
澳大利亚 2002.966102 4798.111864 85.593220 6.953559
瑞典 1987.106952 1549.700535 94.625668 7.425668
美国 1994.519891 8677.294861 89.976097 6.923351
英国 1996.630926 4979.837848 89.213318 7.498420
荷兰 2001.198675 957.589404 75.887417 7.160265
西班牙 2001.546275 3355.266366 90.905192 7.025056
阿根廷 2004.212389 2283.938053 92.548673 7.248673
韩国 2008.100596 6527.518629 100.018629 6.351118

In [ ]:

group.sum()

Out[ ]:

年代 投票人数 时长 评分
产地
中国台湾 1235388 5237466 53925 4367.200000
中国大陆 7599372 41380993 309031 22984.800000
中国香港 5668630 23179448 252111 18430.200000
丹麦 393821 394745 17436 1427.600000
俄罗斯 944809 486082 45744 3597.200000
其他 3763593 3048849 165057 13607.900000
加拿大 1419787 1362581 57140 4769.600000
印度 714150 1146173 43058 2443.900000
墨西哥 233156 139462 10839 829.000000
巴西 197989 357027 8749 716.000000
德国 2037971 2679856 94196 7338.300000
意大利 1471329 2500842 77311 5322.700000
日本 10011432 17981631 425563 36006.000000
比利时 273932 170449 11380 986.000000
法国 5551130 10208966 251524 20186.500000
波兰 359652 159577 14613 1347.000000
泰国 590684 1564881 26002 1796.100000
澳大利亚 590875 1415443 25250 2051.300000
瑞典 371589 289794 17695 1388.600000
美国 23363806 101645832 1053980 81100.135704
英国 5307045 13236409 237129 19930.800000
荷兰 302181 144596 11459 1081.200000
西班牙 886685 1486383 40271 3112.100000
阿根廷 226476 258085 10458 819.100000
韩国 2694871 8759930 134225 8523.200000

计算每年的平均评分

In [ ]:

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

Out[ ]:

年代
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

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

In [ ]:

df["年代"] = df["年代"].astype("str")
df.groupby(df["产地"]).median() #不会再对年代进行求取

Out[ ]:

投票人数 时长 评分
产地
中国台湾 487.0 92.0 7.1
中国大陆 502.0 90.0 6.4
中国香港 637.0 92.0 6.5
丹麦 182.0 94.0 7.3
俄罗斯 132.5 93.0 7.7
其他 158.0 90.0 7.4
加拿大 258.0 89.0 6.8
印度 139.0 131.0 7.0
墨西哥 183.0 94.0 7.2
巴西 131.0 96.0 7.3
德国 212.0 94.0 7.3
意大利 187.0 101.0 7.3
日本 359.0 89.0 7.3
比利时 226.0 90.0 7.3
法国 244.0 95.0 7.3
波兰 174.0 87.0 7.5
泰国 542.5 92.5 6.2
澳大利亚 323.0 95.0 7.0
瑞典 191.0 96.0 7.6
美国 415.0 93.0 7.0
英国 345.0 92.0 7.6
荷兰 180.0 85.0 7.3
西班牙 267.0 97.0 7.1
阿根廷 146.0 97.0 7.3
韩国 1007.0 104.0 6.5

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

In [ ]:

df.groupby([df["产地"],df["年代"]]).mean() #根据两个变量进行分组

Out[ ]:

投票人数 时长 评分
产地 年代
中国台湾 1963 121.000000 113.000000 6.400000
1965 153.666667 105.000000 6.800000
1966 51.000000 60.000000 7.900000
1967 4444.000000 112.000000 8.000000
1968 89.000000 83.000000 7.400000
... ... ... ... ...
韩国 2012 5812.542857 100.771429 6.035238
2013 10470.370370 97.731481 6.062037
2014 3776.266667 98.666667 5.650833
2015 3209.247706 100.266055 5.423853
2016 1739.850000 106.100000 5.730000

1578 rows × 3 columns

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

In [ ]:

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

Out[ ]:

产地    年代
中国台湾  1963    6.4000001965    6.8000001966    7.9000001967    8.0000001968    7.400000...
韩国    2012    6.0352382013    6.0620372014    5.6508332015    5.4238532016    5.730000
Name: 评分, Length: 1578, dtype: float64

Series通过unstack方法转化为dataframe

会产生缺失值

In [ ]:

means.unstack().T

Out[ ]:

产地 中国台湾 中国大陆 中国香港 丹麦 俄罗斯 其他 加拿大 印度 墨西哥 巴西 ... 波兰 泰国 澳大利亚 瑞典 美国 英国 荷兰 西班牙 阿根廷 韩国
年代
1888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN 7.950000 NaN NaN NaN NaN
1890 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 4.800000 NaN NaN NaN NaN NaN
1892 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 6.450000 NaN NaN NaN NaN NaN
1895 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2013 7.076471 5.306500 6.105714 6.555556 6.875000 6.853571 6.018182 6.400000 6.983333 8.00 ... 6.966667 5.568000 6.76000 7.100 6.308255 7.460140 6.33 6.358333 6.616667 6.062037
2014 6.522222 4.963830 5.616667 7.120000 7.175000 6.596250 5.921739 6.374194 7.250000 6.86 ... 7.060000 5.653571 6.56875 6.960 6.393056 7.253398 7.30 6.868750 7.150000 5.650833
2015 6.576000 4.969189 5.589189 7.166667 7.342857 6.732727 6.018750 6.736364 6.500000 6.76 ... 6.300000 5.846667 6.88000 7.625 6.231486 7.123256 6.70 6.514286 7.233333 5.423853
2016 NaN 4.712000 5.390909 7.000000 NaN 6.833333 6.200000 6.900000 NaN NaN ... NaN NaN NaN NaN 6.522581 7.200000 NaN NaN NaN 5.730000
2018 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 6.935704 NaN NaN NaN NaN NaN

127 rows × 25 columns

3.3 离散化处理

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

比如,我们不关心具体是9.6还是9.7,都是高分电影,注意的是它所在的等级,可以把评分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精度。

In [ ]:

df["评分等级"] = pd.cut(df["评分"], [0,3,5,7,9,10], labels = ['E','D','C','B','A'])
#labels要和区间划分一一对应
df[0:5]

Out[ ]:

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

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

投票越多的热门程度越高

In [ ]:

bins = np.percentile(df["投票人数"], [0,20,40,60,80,100])
#获取分位数
df["热门程度"] = pd.cut(df["投票人数"],bins,labels = ['E','D','C','B','A'])
df[:5]

Out[ ]:

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

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

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

In [ ]:

df[(df.热门程度 == 'A') & (df.评分等级 == 'E')]

Out[ ]:

年代 产地 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
623 2011 中国大陆 B区 5187 剧情/惊悚/恐怖 2011-06-03 00:00:00 89 2.3 中国大陆 E A
4167 2014 中国大陆 怖偶 4867 悬疑/惊悚 2014-05-07 00:00:00 88 2.8 中国大陆 E A
5200 2011 中国大陆 床下有人 4309 悬疑/惊悚 2011-10-14 00:00:00 100 2.8 中国大陆 E A
6585 2013 中国大陆 帝国秘符 4351 动作/冒险 2013-09-18 00:00:00 93 3.0 中国大陆 E A
8009 2011 中国大陆 飞天 4764 剧情 2011-07-01 00:00:00 115 2.9 中国大陆 E A
8181 2014 中国大陆 分手达人 3937 喜剧/爱情 2014-06-06 00:00:00 90 2.7 中国大陆 E A
9372 2012 中国大陆 孤岛惊魂 2982 悬疑/惊悚/恐怖 2013-01-26 00:00:00 93 2.8 中国大陆 E A
10275 2013 中国大陆 海天盛宴·韦口 3788 情色 2013-10-12 00:00:00 88 2.9 网络 E A
16512 2013 中国大陆 孪生密码 6390 动作/悬疑 2013-11-08 00:00:00 96 2.9 中国大陆 E A
21189 2010 日本 拳皇 6329 动作/科幻/冒险 2012-10-12 00:00:00 93 3.0 中国大陆 E A
22348 2013 中国大陆 闪魂 3119 惊悚/犯罪 2014-02-21 00:00:00 94 2.6 中国大陆 E A
22524 2015 中国大陆 少年毛泽东 3058 动画/儿童/冒险 2015-04-30 00:00:00 76 2.4 中国大陆 E A
23754 2013 英国 史前怪兽 3543 动作/惊悚/冒险 2014-01-01 00:00:00 89 3.0 中国大陆 E A
27832 2011 中国大陆 无极限之危情速递 6319 喜剧/动作/爱情/冒险 2011-08-12 00:00:00 94 2.8 中国大陆 E A
31622 2010 中国大陆 异度公寓 3639 惊悚 2010-06-04 00:00:00 93 2.7 中国大陆 E A
32007 2014 中国大陆 英雄之战 8359 动作/爱情 2014-03-21 00:00:00 90 3.0 中国大陆 E A
32180 2013 中国大陆 咏春小龙 8861 剧情/动作 2013-07-20 00:00:00 90 3.0 中国大陆 E A
32990 2014 中国大陆 再爱一次好不好 6999 喜剧/爱情 2014-04-11 00:00:00 94 3.0 中国大陆 E A
38090 2014 中国大陆 大话天仙 21629 喜剧/奇幻/古装 2014-02-02 00:00:00 91 3.0 中国大陆 E A
38092 2013 中国大陆 天机·富春山居图 74709 动作/冒险 2013-06-09 00:00:00 122 2.9 中国大陆 E A
38093 2014 中国大陆 特工艾米拉 10852 动作/悬疑 2014-04-11 00:00:00 96 2.7 中国大陆 E A
38097 2015 中国大陆 汽车人总动员 12892 喜剧/动画/冒险 2015-07-03 00:00:00 85 2.3 中国大陆 E A
38102 2016 中国大陆 2016年中央电视台春节 17328 歌舞/真人秀 2016-02-07 00:00:00 280 2.3 中国大陆 E A
38108 2014 中国大陆 放手爱 29254 喜剧/爱情 2014-04-30 00:00:00 93 2.3 中国大陆 E A

冷门高分电影

In [ ]:

df[(df.热门程度 == 'E') & (df.评分等级 == 'A')]

Out[ ]:

年代 产地 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
563 2011 英国 BBC喜剧音 38 喜剧/音乐/歌舞 2011-08-13 00:00:00 95 9.3 美国 A E
895 2014 日本 JOJO的奇妙冒险 特别见面会 Walk Like Crusade 36 纪录片 2014-10-26 00:00:00 137 9.3 美国 A E
1099 2012 英国 Pond一家最 45 纪录片 2012-09-29 00:00:00 12 9.2 美国 A E
1540 2007 英国 阿森纳:温格的十一人 74 运动 2007-10-22 00:00:00 78 9.5 美国 A E
1547 2009 英国 阿斯加德远征 59 纪录片 2011-09-17 00:00:00 85 9.3 美国 A E
... ... ... ... ... ... ... ... ... ... ... ...
36846 2012 中国大陆 末了,未了 34 剧情/喜剧/爱情 2012-12-16 00:00:00 90 9.5 美国 A E
37000 2015 中国大陆 身经百战 74 纪录片 2015-03-24 00:00:00 91 9.1 美国 A E
37033 1986 英国 歌唱神探 36 剧情/悬疑/歌舞 1986-11-16 00:00:00 415 9.1 美国 A E
37557 1975 美国 山那边 70 剧情 1975-11-14 00:00:00 103 9.1 美国 A E
37883 2015 美国 62 纪录片/短片 2015-08-19 00:00:00 9 9.1 纽约电影论坛 A E

177 rows × 11 columns

将处理后的数据进行保存

In [ ]:

df.to_excel("movie_data3.xlsx")

3.4 合并数据集

( 1 )append

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

In [ ]:

df_usa = df[df.产地 == "美国"]
df_china = df[df.产地 == "中国大陆"]

In [ ]:

df_china.append(df_usa) #直接追加到后面,最好是变量相同的

Out[ ]:

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

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)

我们选取6部热门电影

In [ ]:

df1 = df.loc[:5]
df1

Out[ ]:

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

In [ ]:

df2 = df.loc[:5][["名字","产地"]]
df2["票房"] = [123344,23454,55556,333,6666,444]

In [ ]:

df2

Out[ ]:

名字 产地 票房
0 肖申克的救赎 美国 123344
1 控方证人 美国 23454
2 美丽人生 意大利 55556
3 阿甘正传 美国 333
4 霸王别姬 中国大陆 6666
5 泰坦尼克号 美国 444

In [ ]:

df2 = df2.sample(frac = 1) #打乱数据,但index还是原来那样

In [ ]:

df2.index = range(len(df2))
df2

Out[ ]:

名字 产地 票房
0 泰坦尼克号 美国 444
1 美丽人生 意大利 55556
2 霸王别姬 中国大陆 6666
3 肖申克的救赎 美国 123344
4 阿甘正传 美国 333
5 控方证人 美国 23454

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

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

In [ ]:

pd.merge(df1, df2, how = "inner", on = "名字")

Out[ ]:

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

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

( 3 )concat

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

In [ ]:

df1 = df[:10]
df2 = df[100:110]
df3 = df[200:210]
dff = pd.concat([df1,df2,df3],axis = 0) #默认axis = 0,列拼接需要修改为1
dff

Out[ ]:

年代 产地 名字 投票人数 类型 上映时间 时长 评分 首映地点 评分等级 热门程度
0 1994 美国 肖申克的救赎 692795 剧情/犯罪 1994-09-10 00:00:00 142 9.6 多伦多电影节 A A
1 1957 美国 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 00:00:00 116 9.5 美国 A A
2 1997 意大利 美丽人生 327855 剧情/喜剧/爱情 1997-12-20 00:00:00 116 9.5 意大利 A A
3 1994 美国 阿甘正传 580897 剧情/爱情 1994-06-23 00:00:00 142 9.4 洛杉矶首映 A A
4 1993 中国大陆 霸王别姬 478523 剧情/爱情/同性 1993-01-01 00:00:00 171 9.4 香港 A A
5 2012 美国 泰坦尼克号 157074 剧情/爱情/灾难 2012-04-10 00:00:00 194 9.4 中国大陆 A A
6 1993 美国 辛德勒的名单 306904 剧情/历史/战争 1993-11-30 00:00:00 195 9.4 华盛顿首映 A A
7 1997 日本 新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai 24355 剧情/动作/科幻/动画/奇幻 1997-07-19 00:00:00 87 9.4 日本 A A
8 2013 日本 银魂完结篇:直到永远的万事屋 劇場版 銀魂 完結篇 万事屋よ 21513 剧情/动画 2013-07-06 00:00:00 110 9.4 日本 A A
9 1994 法国 这个杀手不太冷 662552 剧情/动作/犯罪 1994-09-14 00:00:00 133 9.4 法国 A A
100 1993 韩国 101 146 喜剧/爱情 1993-06-19 00:00:00 112 7.4 韩国 B D
101 1995 英国 10 186 喜剧 1995-01-25 00:00:00 101 7.4 美国 B D
102 2013 韩国 素媛 114819 剧情/家庭 2013-10-02 00:00:00 123 9.1 韩国 A A
103 2003 美国 101忠狗续集:伦敦 924 喜剧/动画/家庭 2003-01-21 00:00:00 70 7.5 美国 B B
104 2000 美国 10 9514 喜剧/家庭 2000-09-22 00:00:00 100 7.0 美国 C A
105 2013 韩国 10 601 剧情 2014-04-24 00:00:00 93 7.2 美国 B C
106 2006 美国 10件或 1770 剧情/喜剧/爱情 2006-12-01 00:00:00 82 7.7 美国 B B
107 2014 美国 10年 1531 喜剧/同性 2015-06-02 00:00:00 90 6.9 美国 C B
108 2012 日本 11·25自决之日 三岛由纪夫与年轻人们 11・25自決の 149 剧情 2012-06-02 00:00:00 119 5.6 日本 C D
109 1997 美国 泰坦尼克号 535491 剧情/爱情/灾难 1998-04-03 00:00:00 194 9.1 中国大陆 A A
200 2014 日本 最完美的离婚 2014特别篇 18478 剧情/喜剧/爱情 2014-02-08 00:00:00 120 9.1 日本 A A
201 2009 日本 2001夜物 84 剧情/动画 2009-10-02 00:00:00 80 6.6 美国 C D
202 2009 中国香港 头七 頭 7039 恐怖 2009-05-21 00:00:00 60 6.2 美国 C A
203 1896 法国 火车进站 L 7001 纪录片/短片 1896-01-06 60 8.8 法国 B A
204 2009 美国 银行舞蹈 6944 短片 1905-07-01 00:00:00 60 7.8 美国 B A
205 2003 荷兰 2003提雅 48 音乐 2003-10-07 00:00:00 200 8.9 美国 B E
206 2012 美国 死亡飞车3:地狱烈 6937 动作 2012-12-12 00:00:00 60 5.8 美国 C A
207 2012 日本 时光钟摆 振り 6876 剧情/动画/短片 2012-03-20 00:00:00 60 8.7 美国 B A
208 2011 中国香港 你还可爱么 你還可愛 6805 短片 2011-04-22 00:00:00 60 8.3 美国 B A
209 2002 中国香港 一碌蔗 6799 剧情/喜剧/爱情 2002-09-19 00:00:00 60 6.7 美国 C A

python数据分析之Pandas-3相关推荐

  1. python常用命令汇总-python数据分析之pandas常用命令整理

    原标题:python数据分析之pandas常用命令整理 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型 ,提供了高效地 ...

  2. python 数据分析day4 Pandas 之 DataFrame

    DataFrame 一. 创建DataFrame 1. 二维数组创建 2. 字典创建 3. JSON创建 4. 读取Excel或CSV文件创建 5. 读数据库(MySQL)创建 二. 常用属性 三. ...

  3. Python数据分析之Pandas库

    Python数据分析之Pandas库 一.Pandas简介 二.Pandas库的安装 三.Pandas的数据结构 四.Series 和 DataFrame 数据结构的使用 五.其他可以参考的网站 一. ...

  4. pandas 排序 给excel_懂Excel轻松入门Python数据分析包pandas(二十五):循环序列分组...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

  5. pandas 排序_懂Excel就能轻松入门Python数据分析包pandas(六):排序

    转发本文并私信我"python",即可获得Python资料以及各种心得(持续更新的) 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死.后来 ...

  6. (转载)Python数据分析之pandas学习

    转载地址:http://www.cnblogs.com/nxld/p/6058591.html Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容: 1.数据 ...

  7. c++控制台应用每一列数据如何对齐_懂Excel就能轻松入门Python数据分析包pandas(十六):合并数据...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

  8. pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

  9. excel处置4000行数据卡_懂Excel就能轻松入门Python数据分析包pandas(三):制作成绩条...

    系列文章: 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死.后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器-- pandas 前言 很 ...

  10. 可自定义匹配规则查找控件_懂Excel轻松入门Python数据分析包pandas(二十八):二分法查找...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 > E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

最新文章

  1. 是时候取消Sprint评审会议了吗?
  2. php iframe 上传图片,利用iframe+php实现图片的上传
  3. linux使用lftp文件自动认证上传下载
  4. android 根据bounds坐标进行点击操作_炫酷的Android时钟UI控件,隔壁产品都馋哭了...
  5. Windows移动开发(二)——闭关修炼
  6. 2016TI杯——寻迹小车
  7. Temami防辐射服为爱起航
  8. beyond-compare 命令行工具
  9. 如何隐藏QDockWidget的标题栏
  10. 用GUI自动控制键盘和鼠标
  11. 时间字符串转中国标准时间转时间戳转年月日格式
  12. java如何将图片转为pdf
  13. 实验二 利用Excel表格进行掷骰子模拟实验
  14. 如何巧妙实现文字变语音?其实文字转语音助手就很好
  15. MATLAB2018a Simulink生成CCS代码教程
  16. 开源物联网平台ThingsBoard数据库40张数据表设计一览
  17. 重装系统后通过修改注册表实现记录还原
  18. 看似简单的任务-分享二维码图片到微信(分享图片的生成)
  19. AFNetworking
  20. 常见接口形式(分类)有哪些?

热门文章

  1. 书单 | 无所不能的Python,从技术到办公,总有一款适合你!
  2. 使用base64格式字符串播放音频
  3. iPad 如何使用妙控键盘
  4. 支付宝支付成功之后的接口_继支付宝微信之后,51信用卡还款也开始收费了,手续费再创新高...
  5. Android 模块 -- 基于XMPP协议的手机多方多端即时通讯方案
  6. 短视频去水印微信小程序,免费去除视频水印
  7. 云原生关乎文化,而不是容器
  8. 嵌入式工资为什么比纯软工资低那么多?
  9. javaSE探赜索隐之四<final与抽象类>
  10. C语言 本地套接字这个审核也不给我通过,老规矩base64