Python数据分析之Pandas(2)

数学建模自用

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: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香港

2.1 数据格式转换

在做数据分析时,原始数据往往会因为各种各样的原因产生各种数据格式的问题
数据格式是我们非常需要注意的一点,数据格式错误往往会造成很严重的后果
很多异常值也是我们经过格式转换后才会发现,对我们规整数据,清洗数据有着重要的作用

查看格式

df["投票人数"].dtype

dtype(‘float64’)

df["投票人数"] = df["投票人数"].astype("int") #转换格式
df["投票人数"].dtype

dtype(‘int32’)

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香港
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:00932008‎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:008U19487.8美国
df.drop([31169], inplace = True) #删除
df["时长"] = df["时长"].astype("int") #发现第二个错误

在这里插入图片描述

df[df["时长"] == "12J"]
名字投票人数类型产地上映时间时长年代评分首映地点
32458渔业危机41纪录片英国2009-06-19 00:00:0012J20088.2USA
df.drop([32458], inplace = True) #删数据
df["时长"] = df["时长"].astype("int")
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香港

2.2 排序

默认排序

df[:10]
名字投票人数类型产地上映时间时长年代评分首映地点
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香港
5泰坦尼克号157074剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆
6辛德勒的名单306904剧情/历史/战争美国1993-11-30 00:00:0019519939.4华盛顿首映
7新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai24355剧情/动作/科幻/动画/奇幻日本1997-07-19 00:00:008719979.4日本
8银魂完结篇:直到永远的万事屋 劇場版 銀魂 完結篇 万事屋よ21513剧情/动画日本2013-07-06 00:00:0011020139.4日本
9这个杀手不太冷662552剧情/动作/犯罪法国1994-09-14 00:00:0013319949.4法国

按照投票人数进行排序

df.sort_values(by = "投票人数", ascending = False)[:5] #默认从小到大,先改为从大到小
名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
9这个杀手不太冷662552剧情/动作/犯罪法国1994-09-14 00:00:0013319949.4法国
22盗梦空间642134剧情/动作/科幻/悬疑/冒险美国2010-09-01 00:00:0014820109.2中国大陆
3阿甘正传580897剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
99三傻大闹宝莱坞549808剧情/喜剧/爱情/歌舞印度2011-12-08 00:00:0017120099.1中国大陆

按照年代进行排序

df.sort_values(by = "年代")[:5]
名字投票人数类型产地上映时间时长年代评分首映地点
1499朗德海花园场景650短片英国1888-10-146018888.7美国
13791利兹大桥126短片英国1888-106018887.2美国
25767恶作剧51短片美国1905-03-04 00:00:006018904.8美国
10389可怜的比埃洛176喜剧/爱情/动画/短片法国1892-10-286018927.5法国
21417胚胎植入前遗传学筛查69纪录片/短片美国1894-05-186018945.7美国

多个值排序,先按照评分,再按照投票人数

df.sort_values(by = ["评分","投票人数"], ascending = False) #列表中的顺序决定先后顺序
名字投票人数类型产地上映时间时长年代评分首映地点
9049平安结祈 平安結208音乐日本2012-02-24 00:00:006020129.9美国
13625武之舞128纪录片中国大陆1997-02-01 00:00:0060349439.9美国
23190未作回答的问题:伯恩斯坦哈佛六讲61纪录片美国1905-05-29 00:00:006019739.9美国
24880索科洛夫:巴黎现场43音乐法国2002-11-04 00:00:0012720029.9美国
11236公园现场163音乐英国2012-12-03 00:00:006020129.8美国
..............................
2587爸爸我来救你了278喜剧/动作/家庭/儿童/冒险中国大陆2016-01-22 00:00:009020152.2中国大陆
9984大震撼185剧情中国大陆2011-05-19 00:00:006020112.2中国大陆
8816钢管侠168动作中国大陆2015-07-28 00:00:006020152.2中国大陆
12884嫁给大山的女人2690剧情中国大陆2009-04-22 00:00:008820092.1中国大陆
28663都是手机惹的祸42喜剧中国大陆2013-01-18 00:00:006020122.0中国大陆

38167 rows × 9 columns

2.3 基本统计分析

( 1 )描述性统计

dataframe.describe():对dataframe中的数值型数据进行描述性统计

df.describe()
投票人数时长年代评分
count38167.00000038167.00000038167.00000038167.000000
mean6268.13129189.4755941998.8052776.922154
std26298.33160283.763856255.0653961.263782
min21.0000001.0000001888.0000002.000000
25%101.00000060.0000001990.0000006.300000
50%354.00000093.0000002005.0000007.100000
75%1798.500000106.0000002010.0000007.800000
max692795.00000011500.00000039180.0000009.900000

通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的。

df[df["年代"] > 2024] #异常值
名字投票人数类型产地上映时间时长年代评分首映地点
13625武之舞128纪录片中国大陆1997-02-01 00:00:0060349439.9美国
16823妈妈回来吧-中国打工村的孩子49纪录片日本2007-04-08 00:00:00109391808.9美国
df[df["时长"] > 1000] #异常值
名字投票人数类型产地上映时间时长年代评分首映地点
19370怒海余生54剧情/家庭/冒险美国1937-09-01 00:00:001150019377.9美国
38160喧闹村的孩子们36家庭瑞典1986-12-06 00:00:00920019868.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.0000000.126953
评分0.1269531.000000
df[["投票人数", "评分"]].cov()
投票人数评分
投票人数6.916707e+084219.174348
评分4.219174e+031.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 = ["投票人数","时长","评分"]) #统计各个年代中所有数值型数据的均值(默认)
投票人数时长评分
年代
1888388.00000060.0000007.950000
189051.00000060.0000004.800000
1892176.00000060.0000007.500000
1894112.66666760.0000006.633333
1895959.87500060.0000007.575000
............
20137694.10672785.3373806.375974
20147803.98393186.3545806.249384
20157954.99936390.3384326.121925
20167341.38888991.6468255.834524
2018123456.000000142.0000006.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.00000060.0000007.950000
1890美国51.00000060.0000004.800000
1892法国176.00000060.0000007.500000
1894法国148.00000060.0000007.000000
美国95.00000060.0000006.450000
...............
2016法国44.666667104.3333337.300000
美国11224.22580693.1612906.522581
英国14607.27272785.5454557.200000
韩国1739.850000106.1000005.730000
2018美国123456.000000142.0000006.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"])
summean
投票人数评分投票人数评分
产地
中国台湾52374664367.2000008474.8640787.066667
中国大陆4138099322984.80000010915.5877086.062991
中国香港2317944818430.2000008141.7098706.473551
丹麦3947451427.6000002003.7817267.246701
俄罗斯4860823597.2000001021.1806727.557143
其他304884913607.9000001619.1444507.226713
加拿大13625814769.6000001921.8349796.727221
印度11461732443.9000003219.5870796.864888
墨西哥139462829.0000001191.9829067.085470
巴西357027716.0000003606.3333337.232323
德国26798567338.3000002624.7365337.187365
意大利25008425322.7000003374.9554667.183131
日本1798163136006.0000003592.0157817.192569
比利时170449986.0000001244.1532857.197080
法国1020896620186.5000003663.0663807.243093
波兰1595771347.000000881.6408847.441989
泰国15648811796.1000005322.7244906.109184
澳大利亚14154432051.3000004798.1118646.953559
瑞典2897941388.6000001549.7005357.425668
美国10164583281100.1357048677.2948616.923351
英国1323640919930.8000004979.8378487.498420
荷兰1445961081.200000957.5894047.160265
西班牙14863833112.1000003355.2663667.025056
阿根廷258085819.1000002283.9380537.248673
韩国87599308523.2000006527.5186296.351118

4、非数值(NaN)难以处理。如果想移除它们,可以使用“fill_value”将其设置为0。

pd.pivot_table(df, index = ["产地"], aggfunc = ["sum", "mean"],  values = ["投票人数","时长", "评分"] , fill_value = 0)
summean
投票人数时长评分投票人数时长评分
产地
中国台湾5237466539254367.2000008474.86407887.2572827.066667
中国大陆4138099330903122984.80000010915.58770881.5170146.062991
中国香港2317944825211118430.2000008141.70987088.5532146.473551
丹麦394745174361427.6000002003.78172688.5076147.246701
俄罗斯486082457443597.2000001021.18067296.1008407.557143
其他304884916505713607.9000001619.14445087.6563997.226713
加拿大1362581571404769.6000001921.83497980.5923846.727221
印度1146173430582443.9000003219.587079120.9494386.864888
墨西哥13946210839829.0000001191.98290692.6410267.085470
巴西3570278749716.0000003606.33333388.3737377.232323
德国2679856941967338.3000002624.73653392.2585707.187365
意大利2500842773115322.7000003374.955466104.3333337.183131
日本1798163142556336006.0000003592.01578185.0105877.192569
比利时17044911380986.0000001244.15328583.0656937.197080
法国1020896625152420186.5000003663.06638090.2490137.243093
波兰159577146131347.000000881.64088480.7348077.441989
泰国1564881260021796.1000005322.72449088.4421776.109184
澳大利亚1415443252502051.3000004798.11186485.5932206.953559
瑞典289794176951388.6000001549.70053594.6256687.425668
美国101645832105398081100.1357048677.29486189.9760976.923351
英国1323640923712919930.8000004979.83784889.2133187.498420
荷兰144596114591081.200000957.58940475.8874177.160265
西班牙1486383402713112.1000003355.26636690.9051927.025056
阿根廷25808510458819.1000002283.93805392.5486737.248673
韩国87599301342258523.2000006527.518629100.0186296.351118

5、加入margins = True,可以在下方显示一些总和数据(All)。

pd.pivot_table(df, index = ["产地"], values = ["投票人数","时长", "评分"], aggfunc = ["sum", "mean"], fill_value = 0, margins = True)
summean
投票人数时长评分投票人数时长评分
产地
中国台湾5237466539254367.2000008474.86407887.2572827.066667
中国大陆4138099330903122984.80000010915.58770881.5170146.062991
中国香港2317944825211118430.2000008141.70987088.5532146.473551
丹麦394745174361427.6000002003.78172688.5076147.246701
俄罗斯486082457443597.2000001021.18067296.1008407.557143
其他304884916505713607.9000001619.14445087.6563997.226713
加拿大1362581571404769.6000001921.83497980.5923846.727221
印度1146173430582443.9000003219.587079120.9494386.864888
墨西哥13946210839829.0000001191.98290692.6410267.085470
巴西3570278749716.0000003606.33333388.3737377.232323
德国2679856941967338.3000002624.73653392.2585707.187365
意大利2500842773115322.7000003374.955466104.3333337.183131
日本1798163142556336006.0000003592.01578185.0105877.192569
比利时17044911380986.0000001244.15328583.0656937.197080
法国1020896625152420186.5000003663.06638090.2490137.243093
波兰159577146131347.000000881.64088480.7348077.441989
泰国1564881260021796.1000005322.72449088.4421776.109184
澳大利亚1415443252502051.3000004798.11186485.5932206.953559
瑞典289794176951388.6000001549.70053594.6256687.425668
美国101645832105398081100.1357048677.29486189.9760976.923351
英国1323640923712919930.8000004979.83784889.2133187.498420
荷兰144596114591081.200000957.58940475.8874177.160265
西班牙1486383402713112.1000003355.26636690.9051927.025056
阿根廷25808510458819.1000002283.93805392.5486737.248673
韩国87599301342258523.2000006527.518629100.0186296.351118
All2392355003394146264162.4357046268.78128088.9381346.921952

6、对不同值执行不同的函数:可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加整洁才行。

对各个产地的投票人数求和,对评分求均值:

pd.pivot_table(df, index = ["产地"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0)
投票人数评分
产地
中国台湾52374667.066667
中国大陆413809936.062991
中国香港231794486.473551
丹麦3947457.246701
俄罗斯4860827.557143
其他30488497.226713
加拿大13625816.727221
印度11461736.864888
墨西哥1394627.085470
巴西3570277.232323
德国26798567.187365
意大利25008427.183131
日本179816317.192569
比利时1704497.197080
法国102089667.243093
波兰1595777.441989
泰国15648816.109184
澳大利亚14154436.953559
瑞典2897947.425668
美国1016458326.923351
英国132364097.498420
荷兰1445967.160265
西班牙14863837.025056
阿根廷2580857.248673
韩国87599306.351118

对各个年份的投票人数求和,对评分求均值:

pd.pivot_table(df, index = ["年代"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0, margins = True)
投票人数评分
年代
18887767.950000
1890514.800000
18921767.500000
18943386.633333
189576797.575000
.........
2014145700386.249384
2015124813946.121925
201618500305.834524
20181234566.935704
All2392355006.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]
投票人数评分
年代
18887767.950000
1890514.800000
18921767.500000
18943386.633333
189576797.575000

1994年被誉为电影史上最伟大的一年,但是通过数据我们可以发现,1994年的平均得分其实并不是很高。1924年的电影均分最高。

table[table.index == 1994]
投票人数评分
年代
199456681657.25726
table.sort_values("评分", ascending = False)
投票人数评分
年代
1924103828.059259
1928161337.964103
18887767.950000
19127247.925000
192376117.811765
.........
2013152112496.375974
2014145700386.249384
2015124813946.121925
201618500305.834524
1890514.800000

127 rows × 2 columns

同样的,我们也可以按照多个索引来进行汇总。

pd.pivot_table(df, index = ["产地", "年代"], values = ["投票人数", "评分"], aggfunc = {"投票人数":"sum", "评分":"mean"}, fill_value = 0)
投票人数评分
产地年代
中国台湾19631216.400000
19654616.800000
1966517.900000
196744448.000000
19681787.400000
............
韩国20126103176.035238
201311308006.062037
20144531525.650833
20153498085.423853
2016347975.730000

1578 rows × 2 columns

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值