数学建模自用
Python数据分析之Pandas(2)
import pandas as pd
import numpy as np
df = pd.read_excel(r"E:\python\作业3\movie_data.xlsx")#读入上次的数据
df[:5]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
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 | 香港 |
2.1 数据格式转换
在做数据分析时,原始数据往往会因为各种各样的原因产生各种数据格式的问题
数据格式是我们非常需要注意的一点,数据格式错误往往会造成很严重的后果
很多异常值也是我们经过格式转换后才会发现,对我们规整数据,清洗数据有着重要的作用
查看格式
df["投票人数"].dtype
dtype(‘float64’)
df["投票人数"] = df["投票人数"].astype("int") #转换格式
df["投票人数"].dtype
dtype(‘int32’)
df[:5]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
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 | 香港 |
df["产地"].dtype#'O'就是字符串格式
dtype(‘O’)
df["产地"] = df["产地"].astype("str")
df["产地"].dtype
dtype(‘O’)
将年份转化为整数格式
df["年代"] = df["年代"].astype("int") #有异常值会报错
df[df.年代 == "2008\u200e"] #找到异常数据
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
14934 | 狂蟒惊魂 | 544 | 恐怖 | 中国大陆 | 2008-04-08 00:00:00 | 93 | 2008 | 2.7 | 美国 |
df[df.年代 == "2008\u200e"]["年代"].values #后面是unicode的控制字符,使得其显示靠左,因此需要处理删除
array([‘2008\u200e’], dtype=object)
df.loc[14934,"年代"] = 2008 #修改数据
df.loc[14934]
名字 狂蟒惊魂
投票人数 544
类型 恐怖
产地 中国大陆
上映时间 2008-04-08 00:00:00
时长 93
年代 2008
评分 2.7
首映地点 美国
Name: 14934, dtype: object
df["年代"] = df["年代"].astype("int")
df["年代"][:5] #转换成功
0 1994
1 1957
2 1997
3 1994
4 1993
Name: 年代, dtype: int32
将时长转化为整数格式
df["时长"] = df["时长"].astype("int")
df[df["时长"] == "8U"] #寻找异常值,不知道怎么改的话可以删除
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
31169 | 一个被隔绝的世界 | 46 | 纪录片/短片 | 瑞典 | 2001-10-25 00:00:00 | 8U | 1948 | 7.8 | 美国 |
df.drop([31169], inplace = True) #删除
df["时长"] = df["时长"].astype("int") #发现第二个错误
df[df["时长"] == "12J"]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
32458 | 渔业危机 | 41 | 纪录片 | 英国 | 2009-06-19 00:00:00 | 12J | 2008 | 8.2 | USA |
df.drop([32458], inplace = True) #删数据
df["时长"] = df["时长"].astype("int")
df[:5]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
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 | 香港 |
2.2 排序
默认排序
df[:10]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
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 | 法国 |
按照投票人数进行排序
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 | 中国大陆 |
按照年代进行排序
df.sort_values(by = "年代")[:5]
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
1499 | 朗德海花园场景 | 650 | 短片 | 英国 | 1888-10-14 | 60 | 1888 | 8.7 | 美国 |
13791 | 利兹大桥 | 126 | 短片 | 英国 | 1888-10 | 60 | 1888 | 7.2 | 美国 |
25767 | 恶作剧 | 51 | 短片 | 美国 | 1905-03-04 00:00:00 | 60 | 1890 | 4.8 | 美国 |
10389 | 可怜的比埃洛 | 176 | 喜剧/爱情/动画/短片 | 法国 | 1892-10-28 | 60 | 1892 | 7.5 | 法国 |
21417 | 胚胎植入前遗传学筛查 | 69 | 纪录片/短片 | 美国 | 1894-05-18 | 60 | 1894 | 5.7 | 美国 |
多个值排序,先按照评分,再按照投票人数
df.sort_values(by = ["评分","投票人数"], ascending = False) #列表中的顺序决定先后顺序
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
9049 | 平安结祈 平安結 | 208 | 音乐 | 日本 | 2012-02-24 00:00:00 | 60 | 2012 | 9.9 | 美国 |
13625 | 武之舞 | 128 | 纪录片 | 中国大陆 | 1997-02-01 00:00:00 | 60 | 34943 | 9.9 | 美国 |
23190 | 未作回答的问题:伯恩斯坦哈佛六讲 | 61 | 纪录片 | 美国 | 1905-05-29 00:00:00 | 60 | 1973 | 9.9 | 美国 |
24880 | 索科洛夫:巴黎现场 | 43 | 音乐 | 法国 | 2002-11-04 00:00:00 | 127 | 2002 | 9.9 | 美国 |
11236 | 公园现场 | 163 | 音乐 | 英国 | 2012-12-03 00:00:00 | 60 | 2012 | 9.8 | 美国 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2587 | 爸爸我来救你了 | 278 | 喜剧/动作/家庭/儿童/冒险 | 中国大陆 | 2016-01-22 00:00:00 | 90 | 2015 | 2.2 | 中国大陆 |
9984 | 大震撼 | 185 | 剧情 | 中国大陆 | 2011-05-19 00:00:00 | 60 | 2011 | 2.2 | 中国大陆 |
8816 | 钢管侠 | 168 | 动作 | 中国大陆 | 2015-07-28 00:00:00 | 60 | 2015 | 2.2 | 中国大陆 |
12884 | 嫁给大山的女人 | 2690 | 剧情 | 中国大陆 | 2009-04-22 00:00:00 | 88 | 2009 | 2.1 | 中国大陆 |
28663 | 都是手机惹的祸 | 42 | 喜剧 | 中国大陆 | 2013-01-18 00:00:00 | 60 | 2012 | 2.0 | 中国大陆 |
38167 rows × 9 columns
2.3 基本统计分析
( 1 )描述性统计
dataframe.describe():对dataframe中的数值型数据进行描述性统计
df.describe()
投票人数 | 时长 | 年代 | 评分 | |
---|---|---|---|---|
count | 38167.000000 | 38167.000000 | 38167.000000 | 38167.000000 |
mean | 6268.131291 | 89.475594 | 1998.805277 | 6.922154 |
std | 26298.331602 | 83.763856 | 255.065396 | 1.263782 |
min | 21.000000 | 1.000000 | 1888.000000 | 2.000000 |
25% | 101.000000 | 60.000000 | 1990.000000 | 6.300000 |
50% | 354.000000 | 93.000000 | 2005.000000 | 7.100000 |
75% | 1798.500000 | 106.000000 | 2010.000000 | 7.800000 |
max | 692795.000000 | 11500.000000 | 39180.000000 | 9.900000 |
通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的。
df[df["年代"] > 2024] #异常值
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
13625 | 武之舞 | 128 | 纪录片 | 中国大陆 | 1997-02-01 00:00:00 | 60 | 34943 | 9.9 | 美国 |
16823 | 妈妈回来吧-中国打工村的孩子 | 49 | 纪录片 | 日本 | 2007-04-08 00:00:00 | 109 | 39180 | 8.9 | 美国 |
df[df["时长"] > 1000] #异常值
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
19370 | 怒海余生 | 54 | 剧情/家庭/冒险 | 美国 | 1937-09-01 00:00:00 | 11500 | 1937 | 7.9 | 美国 |
38160 | 喧闹村的孩子们 | 36 | 家庭 | 瑞典 | 1986-12-06 00:00:00 | 9200 | 1986 | 8.7 | 瑞典 |
df.drop(df[df["年代"] > 2024].index, inplace = True)
df.drop(df[df["时长"] > 1000].index, inplace = True) #删除异常数据
df.index = range(len(df)) #解决删除后索引不连续的问题
( 2 )最值
df["投票人数"].max()
692795
df["投票人数"].min()
21
df["评分"].max()
9.9
df["评分"].min()
2.0
df["年代"].min()
1888
( 3 )均值和中值
df["投票人数"].mean()
6268.7812802976705
df["投票人数"].median()
354.0
df["评分"].mean()
6.921951515969917
df["评分"].median()
7.1
( 4 )方差和标准差
df["评分"].var()
1.5968697056255758
df["评分"].std()
1.263673100776295
( 5 )求和
df["投票人数"].sum()
239235500
( 6 )相关系数和协方差
df[["投票人数", "评分"]].corr()
投票人数 | 评分 | |
---|---|---|
投票人数 | 1.000000 | 0.126953 |
评分 | 0.126953 | 1.000000 |
df[["投票人数", "评分"]].cov()
投票人数 | 评分 | |
---|---|---|
投票人数 | 6.916707e+08 | 4219.174348 |
评分 | 4.219174e+03 | 1.596870 |
( 7 )计数
len(df)
38163
df["产地"].unique() #指定计数产地值
array([‘美国’, ‘意大利’, ‘中国大陆’, ‘日本’, ‘法国’, ‘英国’, ‘韩国’, ‘中国香港’, ‘阿根廷’, ‘德国’,
‘印度’, ‘其他’, ‘加拿大’, ‘波兰’, ‘泰国’, ‘澳大利亚’, ‘西班牙’, ‘俄罗斯’, ‘中国台湾’, ‘荷兰’,
‘丹麦’, ‘比利时’, ‘USA’, ‘苏联’, ‘巴西’, ‘瑞典’, ‘西德’, ‘墨西哥’], dtype=object)
len(df["产地"].unique())
28
产地中包含了一些重复的数据,比如美国和USA,德国和西德,俄罗斯和苏联
我们可以通过数据替换的方法将这些相同国家的电影数据合并一下。
df["产地"].replace("USA","美国",inplace = True) #第一个参数是要替换的值,第二个参数是替换后的值
df["产地"].replace(["西德","苏联"],["德国","俄罗斯"], inplace = True) #注意一一对应
len(df["产地"].unique())
25
df["年代"].unique()
array([1994, 1957, 1997, 1993, 2012, 2013, 2003, 2016, 2009, 2008, 2001,
1931, 1961, 2010, 2004, 1998, 1972, 1939, 2015, 1946, 2011, 1982,
1960, 2006, 1988, 2002, 1995, 1996, 1984, 2014, 1953, 2007, 2000,
1967, 1983, 1963, 1977, 1966, 1971, 1974, 1985, 1987, 1973, 1962,
1969, 1989, 1979, 1981, 1936, 1954, 1992, 1970, 1991, 2005, 1920,
1933, 1990, 1999, 1896, 1965, 1921, 1947, 1975, 1964, 1943, 1928,
1986, 1895, 1949, 1932, 1905, 1940, 1908, 1900, 1978, 1951, 1958,
1898, 1976, 1938, 1907, 1948, 1952, 1926, 1955, 1906, 1959, 1934,
1944, 1888, 1909, 1925, 1956, 1923, 1945, 1913, 1903, 1904, 1980,
1968, 1917, 1935, 1942, 1950, 1902, 1941, 1930, 1937, 1922, 1916,
1929, 1927, 1919, 1914, 1912, 1924, 1918, 1899, 1901, 1915, 1892,
1894, 1910, 1897, 1911, 1890, 2018])
len(df["年代"].unique())
127
计算每一年电影的数量:
df["年代"].value_counts(ascending = True)[:10] #默认从大到小
年代
2018 1
1890 1
1892 1
1888 2
1899 2
1898 2
1894 3
1897 3
1911 3
1901 4
Name: count, dtype: int64
电影产出前5的国家或地区:
df["产地"].value_counts()[:5]
产地
美国 11714
日本 5006
中国大陆 3791
中国香港 2847
法国 2787
Name: count, dtype: int64
保存数据
df.to_excel("movie_data2.xlsx")
2.4 数据透视
Excel中数据透视表的使用非常广泛,其实Pandas也提供了一个类似的功能,名为pivot_table。
使用pandas中的pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚地知道你想通过透视表解决什么问题。虽然pivot_table看起来只是一个简单的函数,但是它能够快速地对数据进行强大的分析。
1、基础形式
pd.pivot_table(df, index = ["年代"],values = ["投票人数","时长","评分"]) #统计各个年代中所有数值型数据的均值(默认)
投票人数 | 时长 | 评分 | |
---|---|---|---|
年代 | |||
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 |
... | ... | ... | ... |
2013 | 7694.106727 | 85.337380 | 6.375974 |
2014 | 7803.983931 | 86.354580 | 6.249384 |
2015 | 7954.999363 | 90.338432 | 6.121925 |
2016 | 7341.388889 | 91.646825 | 5.834524 |
2018 | 123456.000000 | 142.000000 | 6.935704 |
127 rows × 3 columns
若要展示数据时没有中间的省略号,可以使用options:
pd.options.display.max_rows = 100
pd.options.display.max_colmuns = 500
2、也可以有多个索引。实际上,大多数的pivot_table参数可以通过列表获取多个值。
pd.pivot_table(df, index = ["年代", "产地"],values = ["投票人数","时长","评分"]) #双索引
投票人数 | 时长 | 评分 | ||
---|---|---|---|---|
年代 | 产地 | |||
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 | 法国 | 44.666667 | 104.333333 | 7.300000 |
美国 | 11224.225806 | 93.161290 | 6.522581 | |
英国 | 14607.272727 | 85.545455 | 7.200000 | |
韩国 | 1739.850000 | 106.100000 | 5.730000 | |
2018 | 美国 | 123456.000000 | 142.000000 | 6.935704 |
1578 rows × 3 columns
3、还可以指定函数,来统计不同的统计值
pd.pivot_table(df, index = ["年代", "产地"], values = ["投票人数"], aggfunc = "sum")
投票人数 | ||
---|---|---|
年代 | 产地 | |
1888 | 英国 | 776 |
1890 | 美国 | 51 |
1892 | 法国 | 176 |
1894 | 法国 | 148 |
美国 | 190 | |
... | ... | ... |
2016 | 法国 | 134 |
美国 | 695902 | |
英国 | 160680 | |
韩国 | 34797 | |
2018 | 美国 | 123456 |
1578 rows × 1 columns
通过将“投票人数”列和“评分”列进行对应分组,对“产地”实现数据聚合和总结。
pd.pivot_table(df, index = ["产地"], values = ["投票人数", "评分"], aggfunc = ["sum", "mean"])
sum | mean | |||
---|---|---|---|---|
投票人数 | 评分 | 投票人数 | 评分 | |
产地 | ||||
中国台湾 | 5237466 | 4367.200000 | 8474.864078 | 7.066667 |
中国大陆 | 41380993 | 22984.800000 | 10915.587708 | 6.062991 |
中国香港 | 23179448 | 18430.200000 | 8141.709870 | 6.473551 |
丹麦 | 394745 | 1427.600000 | 2003.781726 | 7.246701 |
俄罗斯 | 486082 | 3597.200000 | 1021.180672 | 7.557143 |
其他 | 3048849 | 13607.900000 | 1619.144450 | 7.226713 |
加拿大 | 1362581 | 4769.600000 | 1921.834979 | 6.727221 |
印度 | 1146173 | 2443.900000 | 3219.587079 | 6.864888 |
墨西哥 | 139462 | 829.000000 | 1191.982906 | 7.085470 |
巴西 | 357027 | 716.000000 | 3606.333333 | 7.232323 |
德国 | 2679856 | 7338.300000 | 2624.736533 | 7.187365 |
意大利 | 2500842 | 5322.700000 | 3374.955466 | 7.183131 |
日本 | 17981631 | 36006.000000 | 3592.015781 | 7.192569 |
比利时 | 170449 | 986.000000 | 1244.153285 | 7.197080 |
法国 | 10208966 | 20186.500000 | 3663.066380 | 7.243093 |
波兰 | 159577 | 1347.000000 | 881.640884 | 7.441989 |
泰国 | 1564881 | 1796.100000 | 5322.724490 | 6.109184 |
澳大利亚 | 1415443 | 2051.300000 | 4798.111864 | 6.953559 |
瑞典 | 289794 | 1388.600000 | 1549.700535 | 7.425668 |
美国 | 101645832 | 81100.135704 | 8677.294861 | 6.923351 |
英国 | 13236409 | 19930.800000 | 4979.837848 | 7.498420 |
荷兰 | 144596 | 1081.200000 | 957.589404 | 7.160265 |
西班牙 | 1486383 | 3112.100000 | 3355.266366 | 7.025056 |
阿根廷 | 258085 | 819.100000 | 2283.938053 | 7.248673 |
韩国 | 8759930 | 8523.200000 | 6527.518629 | 6.351118 |
4、非数值(NaN)难以处理。如果想移除它们,可以使用“fill_value”将其设置为0。
pd.pivot_table(df, index = ["产地"], aggfunc = ["sum", "mean"], values = ["投票人数","时长", "评分"] , fill_value = 0)
sum | mean | |||||
---|---|---|---|---|---|---|
投票人数 | 时长 | 评分 | 投票人数 | 时长 | 评分 | |
产地 | ||||||
中国台湾 | 5237466 | 53925 | 4367.200000 | 8474.864078 | 87.257282 | 7.066667 |
中国大陆 | 41380993 | 309031 | 22984.800000 | 10915.587708 | 81.517014 | 6.062991 |
中国香港 | 23179448 | 252111 | 18430.200000 | 8141.709870 | 88.553214 | 6.473551 |
丹麦 | 394745 | 17436 | 1427.600000 | 2003.781726 | 88.507614 | 7.246701 |
俄罗斯 | 486082 | 45744 | 3597.200000 | 1021.180672 | 96.100840 | 7.557143 |
其他 | 3048849 | 165057 | 13607.900000 | 1619.144450 | 87.656399 | 7.226713 |
加拿大 | 1362581 | 57140 | 4769.600000 | 1921.834979 | 80.592384 | 6.727221 |
印度 | 1146173 | 43058 | 2443.900000 | 3219.587079 | 120.949438 | 6.864888 |
墨西哥 | 139462 | 10839 | 829.000000 | 1191.982906 | 92.641026 | 7.085470 |
巴西 | 357027 | 8749 | 716.000000 | 3606.333333 | 88.373737 | 7.232323 |
德国 | 2679856 | 94196 | 7338.300000 | 2624.736533 | 92.258570 | 7.187365 |
意大利 | 2500842 | 77311 | 5322.700000 | 3374.955466 | 104.333333 | 7.183131 |
日本 | 17981631 | 425563 | 36006.000000 | 3592.015781 | 85.010587 | 7.192569 |
比利时 | 170449 | 11380 | 986.000000 | 1244.153285 | 83.065693 | 7.197080 |
法国 | 10208966 | 251524 | 20186.500000 | 3663.066380 | 90.249013 | 7.243093 |
波兰 | 159577 | 14613 | 1347.000000 | 881.640884 | 80.734807 | 7.441989 |
泰国 | 1564881 | 26002 | 1796.100000 | 5322.724490 | 88.442177 | 6.109184 |
澳大利亚 | 1415443 | 25250 | 2051.300000 | 4798.111864 | 85.593220 | 6.953559 |
瑞典 | 289794 | 17695 | 1388.600000 | 1549.700535 | 94.625668 | 7.425668 |
美国 | 101645832 | 1053980 | 81100.135704 | 8677.294861 | 89.976097 | 6.923351 |
英国 | 13236409 | 237129 | 19930.800000 | 4979.837848 | 89.213318 | 7.498420 |
荷兰 | 144596 | 11459 | 1081.200000 | 957.589404 | 75.887417 | 7.160265 |
西班牙 | 1486383 | 40271 | 3112.100000 | 3355.266366 | 90.905192 | 7.025056 |
阿根廷 | 258085 | 10458 | 819.100000 | 2283.938053 | 92.548673 | 7.248673 |
韩国 | 8759930 | 134225 | 8523.200000 | 6527.518629 | 100.018629 | 6.351118 |
5、加入margins = True,可以在下方显示一些总和数据(All)。
pd.pivot_table(df, index = ["产地"], values = ["投票人数","时长", "评分"], aggfunc = ["sum", "mean"], fill_value = 0, margins = True)
sum | mean | |||||
---|---|---|---|---|---|---|
投票人数 | 时长 | 评分 | 投票人数 | 时长 | 评分 | |
产地 | ||||||
中国台湾 | 5237466 | 53925 | 4367.200000 | 8474.864078 | 87.257282 | 7.066667 |
中国大陆 | 41380993 | 309031 | 22984.800000 | 10915.587708 | 81.517014 | 6.062991 |
中国香港 | 23179448 | 252111 | 18430.200000 | 8141.709870 | 88.553214 | 6.473551 |
丹麦 | 394745 | 17436 | 1427.600000 | 2003.781726 | 88.507614 | 7.246701 |
俄罗斯 | 486082 | 45744 | 3597.200000 | 1021.180672 | 96.100840 | 7.557143 |
其他 | 3048849 | 165057 | 13607.900000 | 1619.144450 | 87.656399 | 7.226713 |
加拿大 | 1362581 | 57140 | 4769.600000 | 1921.834979 | 80.592384 | 6.727221 |
印度 | 1146173 | 43058 | 2443.900000 | 3219.587079 | 120.949438 | 6.864888 |
墨西哥 | 139462 | 10839 | 829.000000 | 1191.982906 | 92.641026 | 7.085470 |
巴西 | 357027 | 8749 | 716.000000 | 3606.333333 | 88.373737 | 7.232323 |
德国 | 2679856 | 94196 | 7338.300000 | 2624.736533 | 92.258570 | 7.187365 |
意大利 | 2500842 | 77311 | 5322.700000 | 3374.955466 | 104.333333 | 7.183131 |
日本 | 17981631 | 425563 | 36006.000000 | 3592.015781 | 85.010587 | 7.192569 |
比利时 | 170449 | 11380 | 986.000000 | 1244.153285 | 83.065693 | 7.197080 |
法国 | 10208966 | 251524 | 20186.500000 | 3663.066380 | 90.249013 | 7.243093 |
波兰 | 159577 | 14613 | 1347.000000 | 881.640884 | 80.734807 | 7.441989 |
泰国 | 1564881 | 26002 | 1796.100000 | 5322.724490 | 88.442177 | 6.109184 |
澳大利亚 | 1415443 | 25250 | 2051.300000 | 4798.111864 | 85.593220 | 6.953559 |
瑞典 | 289794 | 17695 | 1388.600000 | 1549.700535 | 94.625668 | 7.425668 |
美国 | 101645832 | 1053980 | 81100.135704 | 8677.294861 | 89.976097 | 6.923351 |
英国 | 13236409 | 237129 | 19930.800000 | 4979.837848 | 89.213318 | 7.498420 |
荷兰 | 144596 | 11459 | 1081.200000 | 957.589404 | 75.887417 | 7.160265 |
西班牙 | 1486383 | 40271 | 3112.100000 | 3355.266366 | 90.905192 | 7.025056 |
阿根廷 | 258085 | 10458 | 819.100000 | 2283.938053 | 92.548673 | 7.248673 |
韩国 | 8759930 | 134225 | 8523.200000 | 6527.518629 | 100.018629 | 6.351118 |
All | 239235500 | 3394146 | 264162.435704 | 6268.781280 | 88.938134 | 6.921952 |
6、对不同值执行不同的函数:可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加整洁才行。
对各个产地的投票人数求和,对评分求均值:
pd.pivot_table(df, index = ["产地"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0)
投票人数 | 评分 | |
---|---|---|
产地 | ||
中国台湾 | 5237466 | 7.066667 |
中国大陆 | 41380993 | 6.062991 |
中国香港 | 23179448 | 6.473551 |
丹麦 | 394745 | 7.246701 |
俄罗斯 | 486082 | 7.557143 |
其他 | 3048849 | 7.226713 |
加拿大 | 1362581 | 6.727221 |
印度 | 1146173 | 6.864888 |
墨西哥 | 139462 | 7.085470 |
巴西 | 357027 | 7.232323 |
德国 | 2679856 | 7.187365 |
意大利 | 2500842 | 7.183131 |
日本 | 17981631 | 7.192569 |
比利时 | 170449 | 7.197080 |
法国 | 10208966 | 7.243093 |
波兰 | 159577 | 7.441989 |
泰国 | 1564881 | 6.109184 |
澳大利亚 | 1415443 | 6.953559 |
瑞典 | 289794 | 7.425668 |
美国 | 101645832 | 6.923351 |
英国 | 13236409 | 7.498420 |
荷兰 | 144596 | 7.160265 |
西班牙 | 1486383 | 7.025056 |
阿根廷 | 258085 | 7.248673 |
韩国 | 8759930 | 6.351118 |
对各个年份的投票人数求和,对评分求均值:
pd.pivot_table(df, index = ["年代"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0, margins = True)
投票人数 | 评分 | |
---|---|---|
年代 | ||
1888 | 776 | 7.950000 |
1890 | 51 | 4.800000 |
1892 | 176 | 7.500000 |
1894 | 338 | 6.633333 |
1895 | 7679 | 7.575000 |
... | ... | ... |
2014 | 14570038 | 6.249384 |
2015 | 12481394 | 6.121925 |
2016 | 1850030 | 5.834524 |
2018 | 123456 | 6.935704 |
All | 239235500 | 6.921952 |
128 rows × 2 columns
透视表过滤
table = pd.pivot_table(df, index = ["年代"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0)
type(table)
pandas.core.frame.DataFrame
table[:5]
投票人数 | 评分 | |
---|---|---|
年代 | ||
1888 | 776 | 7.950000 |
1890 | 51 | 4.800000 |
1892 | 176 | 7.500000 |
1894 | 338 | 6.633333 |
1895 | 7679 | 7.575000 |
1994年被誉为电影史上最伟大的一年,但是通过数据我们可以发现,1994年的平均得分其实并不是很高。1924年的电影均分最高。
table[table.index == 1994]
投票人数 | 评分 | |
---|---|---|
年代 | ||
1994 | 5668165 | 7.25726 |
table.sort_values("评分", ascending = False)
投票人数 | 评分 | |
---|---|---|
年代 | ||
1924 | 10382 | 8.059259 |
1928 | 16133 | 7.964103 |
1888 | 776 | 7.950000 |
1912 | 724 | 7.925000 |
1923 | 7611 | 7.811765 |
... | ... | ... |
2013 | 15211249 | 6.375974 |
2014 | 14570038 | 6.249384 |
2015 | 12481394 | 6.121925 |
2016 | 1850030 | 5.834524 |
1890 | 51 | 4.800000 |
127 rows × 2 columns
同样的,我们也可以按照多个索引来进行汇总。
pd.pivot_table(df, index = ["产地", "年代"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"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 | 610317 | 6.035238 |
2013 | 1130800 | 6.062037 | |
2014 | 453152 | 5.650833 | |
2015 | 349808 | 5.423853 | |
2016 | 34797 | 5.730000 |
1578 rows × 2 columns