0


数据分析之Pandas(1)

3.Pandas

文章目录

3.1 Pandas基本介绍

Python Data Analysis Library或pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。pandas提供了大量能使我们快速便捷的处理数据的函数和方法。

import pandas as pd
import numpy as np

3.1.1 Pandas的基本数据结构

pandas中有两种常用的基本结构
•Series
一维数组,与Numpy中的一维array类似,二者与Python基本的数据结构List也很相似。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series种。
•DataFrame
二维的表格型数据结构,很多功能与R种的data.frame类似。可以将DataFrame理解为Series的容器。

3.1.1.1 Pandas库的Series类型

一维Series可以用一维列表初始化

a=pd.Series([1,3,5,np.nan,6,5])##此处Series的S必须大写print(a)
结果
01.013.025.03    NaN
46.055.0
dtype: float64

默认的情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。

b=pd.Series([1,3,5,np.nan,6,5],index=['a','b','c','d','e','f'])print(b)
结果
a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    5.0
dtype: float64

索引——数据行标签

查看索引

a.index
结果
RangeIndex(start=0, stop=6, step=1)-----------------------------------------------
b.index
结果
Index(['a','b','c','d','e','f'], dtype='object')

查看取值

a.values
结果
array([1.,3.,5., nan,6.,5.])------------------------------
a[0]
结果
1.0

切片

a[2:5]
结果
25.03    NaN
46.0
dtype: float64
b['b':'f':2]## 经过多次实践发现自定义索引的确是包头包尾
结果
b    3.0
d    NaN
f    5.0
dtype: float64

索引赋值

a.index.name='索引'
a
结果

索引
01.013.025.03    NaN
46.055.0
dtype: float64

和Series里面赋值一样

a.index=list('abcdef')
a
结果
a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    5.0
dtype: float64
3.1.1.2 Pandas库的DataFrame类型
DataFrame初始化

DataFrame是个二维结构,这里首先构造一组时间序列,作为第一维的下标

date=pd.date_range('20230312',periods=6)print(date)
结果
DatetimeIndex(['2023-03-12','2023-03-13','2023-03-14','2023-03-15','2023-03-16','2023-03-17'],
              dtype='datetime64[ns]', freq='D')

然后创建一个DataFream结构

df=pd.DataFrame(np.random.randn(6,4))
df    ##默认使用0、1、2.。。作为索引index

01230-1.4901251.298987-0.5433611.2219801-0.8497090.118608-0.9557150.1449802-0.599598-0.756037-1.795249-0.2824953-0.3325861.750622-1.493345-2.1000134-0.905893-0.254791-1.476728-0.0016515-1.121065-1.861881-0.5024200.523135

df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
df    ##index参数设置行索引,columns参数设置列索引,默认情况下不指定index和columns,他们的值从0开始

ABCD2023-03-120.443978-0.5682800.539422-1.8088152023-03-13-0.9419461.600655-0.165418-0.1433332023-03-140.0581861.299691-0.722582-0.2581702023-03-150.912441-1.347266-0.827097-1.1896252023-03-160.4271250.010411-0.3904111.1722772023-03-17-0.584286-0.4281190.5363051.327480
除了向DataFrame中传入二维数组,我们也可以使用字典传入数据

df1=pd.DataFrame({'A':1,'B':pd.Timestamp('20230312'),'C':pd.Series(1,index=list(range(4)),dtype=float),'D':np.array([3]*4,dtype=int),'E':pd.Categorical(['test','train','test','train']),'F':'abc'})
df1

ABCDEF012023-03-121.03testabc112023-03-121.03trainabc212023-03-121.03testabc312023-03-121.03trainabc
字典的每个key代表一列,其value可以是各种能够转化为Series的对象
与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同

df1.dtypes
结果
A             int64
B    datetime64[ns]
C           float64
D             int32
E          category
F            object
dtype:object
DataFrame查看数据

头尾数据
head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5)

df.head()

ABCD2023-03-120.443978-0.5682800.539422-1.8088152023-03-13-0.9419461.600655-0.165418-0.1433332023-03-140.0581861.299691-0.722582-0.2581702023-03-150.912441-1.347266-0.827097-1.1896252023-03-160.4271250.010411-0.3904111.172277

df.tail(3)##后三行

ABCD2023-03-150.912441-1.347266-0.827097-1.1896252023-03-160.4271250.010411-0.3904111.1722772023-03-17-0.584286-0.4281190.5363051.327480下标、列标、数据下标使用index属性查看

df.index
结果
DatetimeIndex(['2020-01-01','2020-01-02','2020-01-03','2020-01-04','2020-01-05','2020-01-06'],
              dtype='datetime64[ns]', freq='D')

列标使用columns属性查看

df.columns
结果
Index(['A','B','C','D'], dtype='object')

数据值使用values查看

df.values
结果
array([[0.44397794,-0.56828038,0.53942245,-1.8088147],[-0.94194603,1.60065473,-0.16541752,-0.14333282],[0.05818642,1.2996908,-0.72258188,-0.25816996],[0.91244089,-1.34726583,-0.82709665,-1.18962492],[0.42712501,0.01041125,-0.39041139,1.17227685],[-0.58428589,-0.42811927,0.53630517,1.32747977]])

3.1.2 Pandas读取数据及数据操作

以豆瓣的电影数据作为我们深入了解Pandas的示例
豆瓣电影数据(提取码:7tvl)

df_mv=pd.read_excel(.....)## 括号中填写数据存放的位置
df_mv=pd.read_excel('豆瓣电影数据.xlsx')## 直接填文件名,需要文件在当前目录下
df_mv=pd.read_excel(r'E:\数据分析与挖掘\date\豆瓣电影数据.xlsx')## 这种情况需要在地址前加r,以便转义失效
df_mv.head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

行操作
df_mv.iloc[0]
结果
Unnamed:00
名字                         肖申克的救赎
投票人数                       692795
类型                          剧情/犯罪
产地                             美国
上映时间          1994-09-1000:00:00
时长                            142
年代                           1994
评分                            9.6
首映地点                       多伦多电影节
Name:0, dtype:object
df_mv.iloc[0:5]## 左闭右开

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
也可以使用 loc

df_mv.loc[0:5]## 两边都包

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港55泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆

添加一行
dit={'名字':'复仇者联盟3','投票人数':123456,'类型':'剧情/科幻','产地':'美国','上映时间':'2017-05-04 00:00:00','时长':142,'年代':2017,'评分':8.7,'首映地点':'美国'}
s=pd.Series(dit)
s.name=38738
s
名字                   复仇者联盟3
投票人数                 123456
类型                    剧情/科幻
产地                       美国
上映时间    2017-05-04 00:00:00
时长                      142
年代                     2017
评分                      8.7
首映地点                     美国
Name: 38738, dtype: object
df_mv=df_mv.append(s)
df_mv.tail()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点3873438734.01935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国3873538735.0血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国3873638736.0魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国3873738737.0列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме…32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国38738NaN复仇者联盟3123456.0剧情/科幻美国2017-05-04 00:00:0014220178.7美国

删除一行
df_mv=df_mv.drop([38738])
df_mv.tail()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点3873338733.0神学院 S46.0Adult法国1905-06-05 00:00:005819838.6美国3873438734.01935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国3873538735.0血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国3873638736.0魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国3873738737.0列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме…32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国

列操作
df_mv.columns
Index(['Unnamed: 0', '名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分',
       '首映地点'],
      dtype='object')
df_mv['名字'][0:5]
0    肖申克的救赎
1      控方证人
2     美丽人生 
3      阿甘正传
4      霸王别姬
Name: 名字, dtype: object
df_mv[['名字','类型']][:5]

名字类型0肖申克的救赎剧情/犯罪1控方证人剧情/悬疑/犯罪2美丽人生剧情/喜剧/爱情3阿甘正传剧情/爱情4霸王别姬剧情/爱情/同性

增加一列
df_mv['序号']=range(1,len(df_mv)+1)
df_mv.head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点序号00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节111.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国222.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利333.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映444.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港5

删除一列
df_mv=df_mv.drop('序号',axis=1)## axis = 1 代表列方向
df_mv.head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国22.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

通过标签选择数据

df.loc[[index],[column]]通过标签选择数据

df_mv.loc[[1,3,4],['名字','评分']]

名字评分1控方证人9.53阿甘正传9.44霸王别姬9.4

df_mv.loc[1,'名字']
'控方证人'
条件选择

选取产地为美国的所有电音

df_mv[df_mv['产地']=='中国大陆'][:5]

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港2121.0大闹天宫74881.0动画/奇幻中国大陆1905-05-14 00:00:0011419619.2上集2929.0穹顶之下51113.0纪录片中国大陆2015-02-28 00:00:0010420159.2中国大陆3838.0茶馆10678.0剧情/历史中国大陆1905-06-04 00:00:0011819829.2美国4545.0山水情10781.0动画/短片中国大陆1905-06-10 00:00:001919889.2美国
选取产地为美国,且评分大于9的电影

df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head()
或者--------------------------------------------
df[(df['产地']=='美国')&(df['评分']>9)].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映55.0泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆66.0辛德勒的名单306904.0剧情/历史/战争美国1993-11-30 00:00:0019519939.4华盛顿首映
选取产地为美国或中国大陆,且评分大于9的电影

df_mv[((df_mv.产地=='美国')|(df_mv.产地=='中国大陆'))&(df_mv.评分>9)].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港55.0泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆

3.1.3 数据清洗

缺失值处理

dropna:根据标签中的缺失值进行过滤,删除缺失值
fillna:对缺失值进行填充
isnull:返回一个布尔值对象,判断哪些值是缺失值
notnull:isnull的否定式

判断缺失值
df_mv[df_mv['名字'].isnull()].head()
或者-------------------------------------
df[df.名字.isnull()].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点231231.0NaN144.0纪录片/音乐韩国2011-02-02 00:00:009020119.7美国361361.0NaN80.0短片其他1905-05-17 00:00:00419645.7美国369369.0NaN5315.0剧情日本2004-07-10 00:00:0011120047.5日本372372.0NaN263.0短片/音乐英国1998-06-30 00:00:003419989.2美国374374.0NaN47.0短片其他1905-05-17 00:00:00319646.7美国

填充缺失值

填充字符类

df_mv[df_mv['名字'].isnull()].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点231231.0NaN144.0纪录片/音乐韩国2011-02-02 00:00:009020119.7美国361361.0NaN80.0短片其他1905-05-17 00:00:00419645.7美国369369.0NaN5315.0剧情日本2004-07-10 00:00:0011120047.5日本372372.0NaN263.0短片/音乐英国1998-06-30 00:00:003419989.2美国374374.0NaN47.0短片其他1905-05-17 00:00:00319646.7美国

df_mv['名字'].fillna('未知电影',inplace=True)
df_mv[df_mv['名字'].isnull()].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
填充数值类

##添加一行,用于实验。此处设置评分为空nan
dit={'名字':'复仇者联盟3','投票人数':123456,'类型':'剧情/科幻','产地':'美国','上映时间':'2017-05-04 00:00:00','时长':142,'年代':2017,'评分':np.nan,'首映地点':'美国'}
s=pd.Series(dit)
s.name=38738
df_mv=df_mv.append(s)
##判断“评分”为空的
df_mv[df_mv['评分'].isnull()].head()

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点38738NaN复仇者联盟3123456.0剧情/科幻美国2017-05-04 00:00:001422017NaN美国

##填充评分,此处填充 均值
df_mv['评分'].fillna(np.mean(df_mv['评分']),inplace=True)
df_mv[-1:]

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点38738NaN复仇者联盟3123456.0剧情/科幻美国2017-05-04 00:00:0014220176.935704美国

删除缺失值

df.dropna(参数)

subset=[‘列名’]:删除该列为空的行
how=‘all’:删除全为空值的行或列
inplace=True:覆盖之前的数据
axis=0:选择行或列(=0,删除一行;=1,删除一列),默认为0

len(df_mv)
38739
df_mv1=df_mv.dropna()len(df_mv1)len(df_mv)## 值未变,因为未设置inplace=True
38735
38739
异常值处理

异常值,即在数据集中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等等,都属与异常值的范围。

对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了。

df_mv[(df_mv.投票人数<0)|(df_mv['投票人数']%1!=0)]

Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点1977719777.0皇家大贼 皇家大-80.00剧情/犯罪中国香港1985-05-31 00:00:006019856.3美国1978619786.0日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬-80.00纪录片日本1905-06-26 00:00:006020047.9美国1979119791.0女教师 女教8.30剧情/犯罪日本1977-10-29 00:00:0010019776.6日本1979719797.0女教徒-118.00剧情法国1966-05-06 00:00:0013519667.8美国1980419804.0女郎漫游仙境 ドレミファ娘の血は騒5.90喜剧/歌舞日本1985-11-03 00:00:008019856.7日本1982019820.0女仆日记12.87剧情法国2015-04-01 00:00:009620155.7法国3805538055.0逃出亚卡拉12.87剧情/动作/惊悚/犯罪美国1979-09-20 00:00:0011219797.8美国

df.drop(df[(df.投票人数<0)|(df_mv['投票人数']%1!=0)].index,inplace=True)
或者
df=df[(df.投票人数>0)|(df_mv['投票人数']%1==0)]

3.1.4 数据保存

数据处理之后,然后将数据重新保存

df_mv.to_excel('movie_data.xlsx')## 未指定目录地址,默认存到当前目录下

3.2 Pandas操作

import pandas as pd
import numpy as np

以豆瓣电影为例

df=pd.read_excel('movie_data.xlsx')
df=df.drop('Unnamed: 0',axis=1)
df.head()

名字投票人数类型产地上映时间时长年代评分首映地点0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

3.2.1 数据格式转换

查看格式

df['投票人数'].dtype
dtype('float64')

格式转化

df['投票人数']=df['投票人数'].astype('int')
df['投票人数'].dtype
dtype('int32')

将年代格式转化为整型

df['年代'].dtype
dtype('O')
df['年代']=df['年代'].astype('int')------------------------------------------------------------------------
报错
------------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)~\AppData\Local\Temp\ipykernel_21876\765820658.py in<module>---->1 df['年代']=df['年代'].astype('int')

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)5910else:5911# else, only a single dtype is given->5912             new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)5913return self._constructor(new_data).__finalize__(self, method="astype")5914 

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)417418defastype(self: T, dtype, copy:bool=False, errors:str="raise")-> T:-->419return self.apply("astype", dtype=dtype, copy=copy, errors=errors)420421defconvert(

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py inapply(self, f, align_keys, ignore_failures,**kwargs)302                     applied = b.apply(f,**kwargs)303else:-->304                     applied =getattr(b, f)(**kwargs)305except(TypeError, NotImplementedError):306ifnot ignore_failures:

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)578         values = self.values
    579-->580         new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)581582         new_values = maybe_coerce_values(new_values)

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array_safe(values, dtype, copy, errors)12901291try:->1292         new_values = astype_array(values, dtype, copy=copy)1293except(ValueError, TypeError):1294# e.g. astype_nansafe can fail on object-dtype of strings

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array(values, dtype, copy)12351236else:->1237         values = astype_nansafe(values, dtype, copy=copy)12381239# in pandas we don't store numpy str dtypes, so convert to object

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)1152# work around NumPy brokenness, #19871153if np.issubdtype(dtype.type, np.integer):->1154return lib.astype_intsafe(arr, dtype)11551156# if we have a datetime/timedelta array of objects

D:\ProgramData\Anaconda3\lib\site-packages\pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()

ValueError: invalid literal forint()with base 10:'2008\u200e'
##年代中有异常值 '2008\u200e',无法正常转化
df[df.年代=='2008\u200e']

名字投票人数类型产地上映时间时长年代评分首映地点15205狂蟒惊魂544恐怖中国大陆2008-04-08 00:00:00932008‎2.7美国

df[df.年代=='2008\u200e']['年代'].values  ## 从整行返回的结果并不能直接看出异常,所以调用valus直接查看
array(['2008\u200e'], dtype=object)
df.loc[15205,'年代']=2008
df.loc[15205]
名字                     狂蟒惊魂
投票人数                    544
类型                       恐怖
产地                     中国大陆
上映时间    2008-04-08 00:00:00
时长                       93
年代                     2008
评分                      2.7
首映地点                     美国
Name: 15205, 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')---------------------------------------------------------------------------
报错
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)~\AppData\Local\Temp\ipykernel_21876\3003640607.py in<module>---->1 df['时长']=df['时长'].astype('int')

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)5910else:5911# else, only a single dtype is given->5912             new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)5913return self._constructor(new_data).__finalize__(self, method="astype")5914 

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)417418defastype(self: T, dtype, copy:bool=False, errors:str="raise")-> T:-->419return self.apply("astype", dtype=dtype, copy=copy, errors=errors)420421defconvert(

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py inapply(self, f, align_keys, ignore_failures,**kwargs)302                     applied = b.apply(f,**kwargs)303else:-->304                     applied =getattr(b, f)(**kwargs)305except(TypeError, NotImplementedError):306ifnot ignore_failures:

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)578         values = self.values
    579-->580         new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)581582         new_values = maybe_coerce_values(new_values)

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array_safe(values, dtype, copy, errors)12901291try:->1292         new_values = astype_array(values, dtype, copy=copy)1293except(ValueError, TypeError):1294# e.g. astype_nansafe can fail on object-dtype of strings

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array(values, dtype, copy)12351236else:->1237         values = astype_nansafe(values, dtype, copy=copy)12381239# in pandas we don't store numpy str dtypes, so convert to object

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)1152# work around NumPy brokenness, #19871153if np.issubdtype(dtype.type, np.integer):->1154return lib.astype_intsafe(arr, dtype)11551156# if we have a datetime/timedelta array of objects

D:\ProgramData\Anaconda3\lib\site-packages\pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()

ValueError: invalid literal forint()with base 10:'8U'
df[df.时长=='8U']

名字投票人数类型产地上映时间时长年代评分首映地点31644一个被隔绝的世界46纪录片/短片瑞典2001-10-25 00:00:008U19487.8美国

df.drop(31644,inplace=True)
df['时长']=df['时长'].astype('int')------------------------------------------------------------------------------------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)~\AppData\Local\Temp\ipykernel_21876\3003640607.py in<module>---->1 df['时长']=df['时长'].astype('int')

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)5910else:5911# else, only a single dtype is given->5912             new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)5913return self._constructor(new_data).__finalize__(self, method="astype")5914 

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)417418defastype(self: T, dtype, copy:bool=False, errors:str="raise")-> T:-->419return self.apply("astype", dtype=dtype, copy=copy, errors=errors)420421defconvert(

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py inapply(self, f, align_keys, ignore_failures,**kwargs)302                     applied = b.apply(f,**kwargs)303else:-->304                     applied =getattr(b, f)(**kwargs)305except(TypeError, NotImplementedError):306ifnot ignore_failures:

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)578         values = self.values
    579-->580         new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)581582         new_values = maybe_coerce_values(new_values)

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array_safe(values, dtype, copy, errors)12901291try:->1292         new_values = astype_array(values, dtype, copy=copy)1293except(ValueError, TypeError):1294# e.g. astype_nansafe can fail on object-dtype of strings

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_array(values, dtype, copy)12351236else:->1237         values = astype_nansafe(values, dtype, copy=copy)12381239# in pandas we don't store numpy str dtypes, so convert to object

D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)1152# work around NumPy brokenness, #19871153if np.issubdtype(dtype.type, np.integer):->1154return lib.astype_intsafe(arr, dtype)11551156# if we have a datetime/timedelta array of objects

D:\ProgramData\Anaconda3\lib\site-packages\pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()

ValueError: invalid literal forint()with base 10:'12J'
df[df.时长=='12J']

名字投票人数类型产地上映时间时长年代评分首映地点32949渔业危机41纪录片英国2009-06-19 00:00:0012J20088.2USA

df.drop(32949,inplace=True)
df['时长']=df['时长'].astype('int')
df['时长'][:5]
0    142
1    116
2    116
3    142
4    171
Name: 时长, dtype: int32

3.1.2 排序

单值排序

默认排序

df[:10]##根据index进行排序

名字投票人数类型产地上映时间时长年代评分首映地点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='投票人数')[:5]

名字投票人数类型产地上映时间时长年代评分首映地点19797女教徒-118剧情法国1966-05-06 00:00:0013519667.8美国19777皇家大贼 皇家大-80剧情/犯罪中国香港1985-05-31 00:00:006019856.3美国19786日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬-80纪录片日本1905-06-26 00:00:006020047.9美国19804女郎漫游仙境 ドレミファ娘の血は騒5喜剧/歌舞日本1985-11-03 00:00:008019856.7日本19791女教师 女教8剧情/犯罪日本1977-10-29 00:00:0010019776.6日本

## 降序排列
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]

名字投票人数类型产地上映时间时长年代评分首映地点14048利兹大桥126短片英国1888-106018887.2美国1700朗德海花园场景650短片英国1888-10-146018888.7美国26170恶作剧51短片美国1905-03-04 00:00:006018904.8美国10627可怜的比埃洛176喜剧/爱情/动画/短片法国1892-10-286018927.5法国14455迪克森实验音膜121短片美国1905-03-08 00:00:006018947.2美国

多个值排序

先按照评分排序,再按照投票人数排序(皆为降序排序)

df.sort_values(by=['评分','投票人数'],ascending=False)[:5]

名字投票人数类型产地上映时间时长年代评分首映地点9278平安结祈 平安結208音乐日本2012-02-24 00:00:006020129.9美国13882武之舞128纪录片中国大陆1997-02-01 00:00:0060349439.9美国1110未知电影76科幻/纪录片美国1905-06-23 00:00:007520019.9美国23559未作回答的问题:伯恩斯坦哈佛六讲61纪录片美国1905-05-29 00:00:006019739.9美国35470未知电影46纪录片/音乐韩国2013-10-31 00:00:009020139.9韩国——————————————————————————————————————————————————————————————————————————————————————先按照评分排序(降序),再按照投票人数排序(升序)

df.sort_values(by=['评分','投票人数'],ascending=[False,True])[:5]

名字投票人数类型产地上映时间时长年代评分首映地点25270索科洛夫:巴黎现场43音乐法国2002-11-04 00:00:0012720029.9美国35465未知电影46纪录片/音乐韩国2013-10-31 00:00:009020139.9韩国23556未作回答的问题:伯恩斯坦哈佛六讲61纪录片美国1905-05-29 00:00:006019739.9美国1110未知电影76科幻/纪录片美国1905-06-23 00:00:007520019.9美国9278平安结祈 平安結208音乐日本2012-02-24 00:00:006020129.9美国

3.1.3基本统计分析

描述性统计

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

df.describe()

投票人数时长年代评分count38737.00000038737.00000038737.00000038737.000000mean6189.17809889.0531281998.7890916.935649std26150.60777783.333528253.1954931.270094min-118.0000001.0000001888.0000002.00000025%98.00000060.0000001990.0000006.30000050%341.00000092.0000002005.0000007.10000075%1741.000000106.0000002010.0000007.800000max692795.00000011500.00000039180.0000009.900000

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

df[df.年代>2023]

名字投票人数类型产地上映时间时长年代评分首映地点13882武之舞128纪录片中国大陆1997-02-01 00:00:0060349439.9美国17115妈妈回来吧-中国打工村的孩子49纪录片日本2007-04-08 00:00:00109391808.9美国

df[df.时长>1000]

名字投票人数类型产地上映时间时长年代评分首映地点19690怒海余生54剧情/家庭/冒险美国1937-09-01 00:00:001150019377.9美国38730喧闹村的孩子们36家庭瑞典1986-12-06 00:00:00920019868.7瑞典

df.drop(df[df.年代>2023].index,inplace=True)
df.drop(df[df.时长>1000].index,inplace=True)
df.describe()

投票人数时长年代评分count38730.00000038730.00000038730.00000038730.000000mean6190.29700588.5238061996.9814616.935420std26152.83845937.94615619.9346571.270018min5.0000001.0000001888.0000002.00000025%98.00000060.0000001990.0000006.30000050%341.00000092.0000002005.0000007.10000075%1741.000000106.0000002010.0000007.800000max692795.000000958.0000002017.0000009.900000

##删除 行 后,重新分配 索引index
df.index=range(len(df))
最值
df['投票人数'].max()
692795
df['投票人数'].min()
5
均值和中值
df['投票人数'].mean()
6190.297004905758
df['投票人数'].median()
341.0
方差和标准差
df['评分'].var()
1.6129445680877672
df['评分'].std()
1.2700175463700363
求和
df['投票人数'].sum()
239750203
相关系数、协方差
## 相关性
df[['投票人数','评分']].corr()

投票人数评分投票人数1.0000000.122925评分0.1229251.000000

## 协方差
df[['投票人数','评分']].cov()

投票人数评分投票人数6.839710e+084082.897271评分4.082897e+031.612945

计数
len(df)len(df[df.产地=='美国'])
df.count()
数据替换
len(df)
38166
## 某列的所有取值
df['产地'].unique()
array(['美国', '意大利', '中国大陆', '日本', '法国', '英国', '韩国', '中国香港', '阿根廷', '德国',
       '印度', '其他', '加拿大', '波兰', '泰国', '澳大利亚', '西班牙', '俄罗斯', '中国台湾', '荷兰',
       '丹麦', '比利时', 'USA', '苏联', '墨西哥', '巴西', '瑞典', '西德'], dtype=object)
len(df['产地'].unique())
28

产地中包含了一些重复数据,比如美国和USA,德国和西德,俄罗斯和苏联

我们可以通过数据替换的方法将这些相同的国家的电影数据合并一下

df['产地'].replace('USA','美国',inplace=True)## USA->美国
df['产地'].replace(['西德','苏联'],['德国','俄罗斯'],inplace=True)## 西德->德国,苏联->俄罗斯len(df['产地'].unique())
25

计算每一年代电影的数量

df['年代'].value_counts()[:10]## 已经自动排序
2012    2018
2013    1977
2008    1926
2014    1867
2010    1863
2011    1845
2009    1837
2007    1685
2015    1570
2006    1488
Name: 年代, dtype: int64

电影产出前5位的国家或地区

df['产地'].value_counts()[:5]
美国      11979
日本       5051
中国大陆     3802
中国香港     2851
法国       2816
Name: 产地, dtype: int64
df.to_excel('movie_data2.xlsx')

3.1.4 数据透视

Pandas提供了一个数据透视表功能,名为pivot_table。
使用pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚的知道你通过透视表解决了什么问题,虽然pivot_table看起来知识一个简单的函数,但是它能够快速的对数据进行强大的分析。

基础形式
## 前面在未设置查看行数时,中间数据是用...代替,下面代码可设置显示长度
pd.set_option('max_columns',100)##设置显示的最大列
pd.set_option('max_rows',500)##设置显示的最大行
pd.pivot_table(df,index=['年代'])## 未设置其他参数,默认均值计算

投票人数时长评分年代1888388.00000060.0000007.950000189051.00000060.0000004.8000001892176.00000060.0000007.5000001894112.66666760.0000006.6333331895959.87500060.0000007.5750001896984.25000060.0000007.037500189767.00000060.0000006.6333331898578.50000060.0000007.450000189971.0000009.5000006.9000001900175.28571436.7142867.2285711901164.50000047.2500007.25000019021934.16666734.6666677.4833331903295.62500029.6250006.9687501904195.87500041.2500007.2125001905332.60000043.8000006.8200001906189.85714330.5714297.3428571907213.60000031.8000007.0200001908258.83333334.1666677.150000190958.60000020.6000007.5600001910105.20000041.8000006.9400001911240.00000025.7500007.3750001912152.20000016.4000007.920000191366.12500057.7500006.8625001914104.92307725.9230776.4730771915314.90000056.8000007.2600001916613.66666743.8333337.7583331917124.41666731.3333337.0750001918357.08333335.1666677.2000001919179.85000062.4000007.4900001920636.50000059.3571437.4928571921729.81818257.3636367.7500001922767.09090966.3636367.8045451923426.00000074.0555567.8833331924371.78571481.1785718.05357119251104.28000084.4400007.7880001926443.60869680.3043487.7739131927695.27586287.2413797.7517241928404.82500071.7750007.9450001929740.54285769.3714297.4400001930555.08000074.1600007.36000019311468.66666778.5238107.4833331932600.08108177.5405417.2945951933729.72000076.3600007.4300001934776.49019683.1960787.5196081935887.69565273.6739137.51521719361465.46666776.2666677.63500019371580.22449085.5102047.5755101938552.00000085.9736847.73684219395911.85714397.3877557.52040819405548.74359092.8205137.57179519411552.80851189.1276607.42766019422607.75471778.2641517.5547171943742.84210578.4561407.61578919441007.37037081.9259267.5388891945989.02040886.9591847.67346919461034.45762785.0169497.6067801947439.40000087.1200007.45333319481186.50574788.2068977.6574711949641.68539381.9887647.64606719502235.02631680.1578957.6552631951956.10126685.6329117.63670919521473.54023081.5287367.74367819534786.11363684.1704557.56704519542180.24509885.5490207.70294119551983.73913083.6695657.58000019561054.60544276.4081637.60000019572973.57943987.3551407.6523361958886.19672182.9754107.53688519591725.07031290.0703127.57187519601446.274809101.3129777.56946619613186.83333398.2156867.74411819621972.11888191.6153857.70489519631184.02797292.0209797.53636419641107.76373689.7142867.52307719651988.18404990.4785287.57607419661319.52514089.4860347.51899419671237.28977391.5909097.48465919681096.22093091.7441867.3174421969593.11111198.6666677.3700481970676.78947496.9736847.29105319711368.50684996.3150687.15570819722299.09661896.2898557.2681161973800.10328694.8826297.25023519741685.78923895.3183867.06233219752222.73979697.5663277.07142919761340.61802695.0557947.1077251977957.12727398.0318187.14818219781001.82089694.4676627.09651719791878.62114596.0000007.29603519802407.68303694.1785717.18660719811609.06204493.3211687.15729919822142.72932391.9849627.29736819831541.19133692.1696757.31010819842667.17346990.9183677.37517019851588.09657393.6168227.27850519862828.50617389.1450627.25679019873128.77551088.9387767.28454819884800.22762188.8593357.26572919892994.41730388.4580157.21068719904965.58778691.8829527.14910919914685.81951293.3707327.15463419925486.13333392.5724147.22367819938117.75963795.2698417.195692199411479.25506191.3441307.26234819958132.60531794.4417187.28936619965095.88394695.2437147.25880119978243.93854794.9702057.33016819987431.79029591.1317167.23830219997137.04960092.4576007.18800020005907.77017892.1915187.13406320018489.75724690.9589377.11014520026552.59333391.5844447.06977820037891.96424890.5583607.13775020048587.63259990.4246707.03136620056506.11084792.0807607.03000820067278.26072690.1445546.91471920076253.83752286.6282886.87510220086750.99694385.1441676.91064720098716.36466286.3845336.75000020109576.38759383.4342526.77036120118763.11039784.1259386.57701020127082.78746385.0999026.45837420137603.72313884.9020496.39260420147723.30259785.9978806.25977720157841.40829189.8636936.14196020167176.01938091.3294575.8682172017123456.000000142.0000006.935704

多个索引 index=[‘’,‘’]

实际上,大多数的pivot_table参数可以通过列表获取多个值

pd.set_option('max_columns',100)
pd.set_option('max_rows',500)
pd.pivot_table(df,index=['年代','产地'])

投票人数时长评分年代产地1888英国388.00000060.0000007.9500001890美国51.00000060.0000004.8000001892法国176.00000060.0000007.5000001894法国148.00000060.0000007.000000美国95.00000060.0000006.450000……………2016法国39.00000093.2500007.475000美国10563.84848591.9848486.540909英国14607.27272785.5454557.200000韩国1739.850000106.1000005.7300002017美国123456.000000142.0000006.935704
1511 rows × 3 columns

指定需要统计汇总的数据 values
pd.pivot_table(df,index=['年代','产地'],values=['评分'])

评分年代产地1888英国7.9500001890美国4.8000001892法国7.5000001894法国7.000000美国6.450000………2016法国7.475000美国6.540909英国7.200000韩国5.7300002017美国6.935704
1511 rows × 1 columns

指定函数 aggfunc
pd.pivot_table(df,index=['年代','产地'],values=['投票人数'],aggfunc=np.sum)

投票人数年代产地1888英国7761890美国511892法国1761894法国148美国190………2016法国156美国697214英国160680韩国347972017美国123456
1511 rows × 1 columns

通过将“投票人数”和“评分”列进行对应分组,对“产地”实现数据聚合和总结

pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc=[np.sum,np.mean])

summean投票人数评分投票人数评分产地中国台湾52374664367.2000008474.8640787.066667中国大陆4143531323058.00000010898.2937936.064703中国香港2328538918457.7000008167.4461596.474114丹麦3947841434.7000001993.8585867.245960俄罗斯316711011031.9000002098.8137847.310736其他305411913895.9000001590.6869797.237448加拿大13847654868.4000001915.3042886.733610印度11462712453.4000003210.8431376.872269墨西哥139613843.4000001173.2184877.087395巴西357136733.5000003536.0000007.262376意大利25022155377.3000003340.7409887.179306日本1800066736339.3000003563.7828157.194476比利时1709871003.3000001230.1223027.217986法国1021396620384.7000003627.1186087.238885波兰1595771347.000000881.6408847.441989泰国15648811796.1000005322.7244906.109184澳大利亚14157132093.4000004719.0433336.978000瑞典2900771423.3000001510.8177087.413021美国10192967283216.4357048509.0301366.946860英国1324956220789.4000004797.0897907.526937荷兰1448361114.500000934.4258067.190323西班牙14867333139.9000003326.0246097.024385阿根廷258271843.7000002226.4741387.273276韩国87610808596.4000006484.8852706.362990

非数值处理 fill_value

非数值(NaN)难以处理,如果想移除他们,可以使用 fill_value 将其设置为0

pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0)

summean年代投票人数时长评分年代投票人数时长评分产地中国台湾12353885237466539254367.2000001999.0097098474.86407887.2572827.066667中国大陆76214884143531330960823058.0000002004.59968410898.29379381.4329306.064703中国香港56766272328538925243118457.7000001991.1003168167.44615988.5412146.474114丹麦395820394784174441434.7000001999.0909091993.85858688.1010107.245960俄罗斯3006734316711014076111031.9000001992.5341292098.81378493.2809817.310736其他3837588305411916716813895.9000001998.7437501590.68697987.0666677.237448加拿大14477801384765579194868.4000002002.4619641915.30428880.1092676.733610印度7161331146271432032453.4000002005.9747903210.843137121.0168076.872269墨西哥23714513961310929843.4000001992.8151261173.21848791.8403367.087395巴西2019873571368869733.5000001999.8712873536.00000087.8118817.262376意大利14871422502215779025377.3000001985.5033383340.740988104.0080117.179306日本101015051800066742786336339.3000001999.9020003563.78281584.7085737.194476比利时277930170987114471003.3000001999.4964031230.12230282.3525187.217986法国56088111021396625316920384.7000001991.7652703627.11860889.9037647.238885波兰359652159577146131347.0000001987.027624881.64088480.7348077.441989泰国5906841564881260021796.1000002009.1292525322.72449088.4421776.109184澳大利亚6008961415713255492093.4000002002.9866674719.04333385.1633336.978000瑞典381491290077178981423.3000001986.9322921510.81770893.2187507.413021美国23892986101929672107031083216.4357041994.5726698509.03013689.3488616.946860英国55149591324956224400520789.4000001996.7266474797.08979088.3435927.526937荷兰310199144836116851114.5000002001.283871934.42580675.3870977.190323西班牙8947101486733404553139.9000002001.5883673326.02460990.5033567.024385阿根廷23246825827110638843.7000002004.0344832226.47413891.7068977.273276韩国271296987610801347348596.4000002008.1191716484.88527099.7290906.362990

计算总合数据 margins=True
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)

summean年代投票人数时长评分年代投票人数时长评分产地中国台湾12353885237466539254367.2000001999.0097098474.86407887.2572827.066667中国大陆76214884143531330960823058.0000002004.59968410898.29379381.4329306.064703中国香港56766272328538925243118457.7000001991.1003168167.44615988.5412146.474114丹麦395820394784174441434.7000001999.0909091993.85858688.1010107.245960俄罗斯3006734316711014076111031.9000001992.5341292098.81378493.2809817.310736其他3837588305411916716813895.9000001998.7437501590.68697987.0666677.237448加拿大14477801384765579194868.4000002002.4619641915.30428880.1092676.733610印度7161331146271432032453.4000002005.9747903210.843137121.0168076.872269墨西哥23714513961310929843.4000001992.8151261173.21848791.8403367.087395巴西2019873571368869733.5000001999.8712873536.00000087.8118817.262376意大利14871422502215779025377.3000001985.5033383340.740988104.0080117.179306日本101015051800066742786336339.3000001999.9020003563.78281584.7085737.194476比利时277930170987114471003.3000001999.4964031230.12230282.3525187.217986法国56088111021396625316920384.7000001991.7652703627.11860889.9037647.238885波兰359652159577146131347.0000001987.027624881.64088480.7348077.441989泰国5906841564881260021796.1000002009.1292525322.72449088.4421776.109184澳大利亚6008961415713255492093.4000002002.9866674719.04333385.1633336.978000瑞典381491290077178981423.3000001986.9322921510.81770893.2187507.413021美国23892986101929672107031083216.4357041994.5726698509.03013689.3488616.946860英国55149591324956224400520789.4000001996.7266474797.08979088.3435927.526937荷兰310199144836116851114.5000002001.283871934.42580675.3870977.190323西班牙8947101486733404553139.9000002001.5883673326.02460990.5033567.024385阿根廷23246825827110638843.7000002004.0344832226.47413891.7068977.273276韩国271296987610801347348596.4000002008.1191716484.88527099.7290906.362990All773371352397497313428380268585.6357041996.9823386190.76435088.5268686.935359

对不同值执行不同函数

可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加简洁才性。

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

pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)

投票人数评分产地中国台湾52374667.066667中国大陆414353136.064703中国香港232853896.474114丹麦3947847.245960俄罗斯31671107.310736其他30541197.237448加拿大13847656.733610印度11462716.872269墨西哥1396137.087395巴西3571367.262376意大利25022157.179306日本180006677.194476比利时1709877.217986法国102139667.238885波兰1595777.441989泰国15648816.109184澳大利亚14157136.978000瑞典2900777.413021美国1019296726.946860英国132495627.526937荷兰1448367.190323西班牙14867337.024385阿根廷2582717.273276韩国87610806.362990

透视表过滤
table=pd.pivot_table(df,index=['年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)type(table)
pandas.core.frame.DataFrame
table[:5]

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

table[table.index==1994]

投票人数评分年代199456707527.262348

table.sort_values('评分',ascending=False)[:10]

投票人数评分年代1924104108.05357118887767.9500001928161937.94500019127617.920000192376687.8833331922168767.8045451925276077.7880001926102037.773913191673647.7583331927201637.751724

按照多个索引来进行汇总
pd.pivot_table(df,index=['产地','年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)

投票人数评分产地年代中国台湾19631216.40000019654616.8000001966517.900000196744448.00000019681787.400000…………韩国20126108296.064151201311309836.09819820144531525.65083320153498085.4238532016347975.730000
1511 rows × 2 columns


本文转载自: https://blog.csdn.net/m0_73856491/article/details/129510813
版权归原作者 Maverick_曲流觞 所有, 如有侵权,请联系我们删除。

“数据分析之Pandas(1)”的评论:

还没有评论