第一篇
1.1 pandas 基本介绍
pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,同时也提供大量能使我们快速便捷的处理数据的函数和方法。
在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame。Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其可通过索引标签的方式获取数据,还具有索引的自动对齐功能;DataFrame类似于numpy中的二维数组,同样可以通用numpy数组的函数和方法,而且还具有其他灵活应用,后续会介绍到。
# `pandas` 是一个 `Python Data Analysis Library`。
# # 安装请参考官网的教程,如果安装了 `Anaconda`,则不需要安装 `pandas` 库。
#使用模块之前先导入
In[1]:
get_ipython().magic('matplotlib inline')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pandas 基本数据结构
pandas 有两种常用的基本结构:
- Series
一维数组,与Numpy中的一维array类似;二者与Python基本的数据结构List也很相近。Series能保存不同种数据类型,字符串、Boolean值、数字等。 - DataFrame
二维的表格型数据结构,很多功能与R中的data.frame类似;可以将DataFrame 理解为Series的容器。
1.2 Pandas库的series 类型
Series是一种类似与一维数组的对象,由下面两部分组成
values:一组数据(ndarray)
index:相关的数据索引标签
一维 `Series` 可以用一维列表初始化:
In[2]:
s = pd.Series([1,3,5,np.nan,6,8]) #np.nan代表空值
print(s)
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
默认情况下,Series的下标都是数字(默认索引为0到n-1的整形索引,可以使用额外参数指定),类型是统一的。可以使用index函数设置索引。
例如:
s = pd.Series([1,3,5,np.nan,6,8],index=['a','b','c','d','e','f'])
print(s)
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 8.0
dtype: float64
索引-数据的行标签:
可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的是一个Series类型)
(1) 显式索引
使用index中的元素作为索引值
使用s.loc[](推荐):注意,loc中括号中放置的一定是显式索引
注意:此时是闭区间
(2)隐式索引:
使用整数作为索引值
使用.iloc[](推荐) iloc中括号中放置的必须是隐式索引
注意:此时是半开区间
In[ ]:
s.index
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
值
In[ ]:
s.values
array([ 1., 3., 5., nan, 6., 8.])
In[ ]:
display(
s[0],
s[3])
1.0
nan
切片操作:隐式索引切片和显式索引切片
显式索引切片:index和loc
隐式索引切片:整数索引值和iloc
In[ ]:
s[2:5]
c 5.0
d NaN
e 6.0
dtype: float64
In[ ]:
s[::2]
a 1.0
c 5.0
e 6.0
dtype: float64
索引赋值
In[ ]:
s.index.name = '索引'
S
索引
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 8.0
dtype: float64
In[ ]:
s.index=list('abcdef')
s
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 8.0
dtype: float64
In[ ]:
s['a':'c'] #这里的区间,全闭
a 1.0
b 3.0
c 5.0
dtype: float64
1.3 Pandas库的Data Frame 类型
Data Frame则是一个二维结构,这里首先构造一个时间序列,作为我们第一维的下标:
In[ ]:
dates = pd.date_range('20170101', periods=6)
print(dates)
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-06'],
dtype='datetime64[ns]', freq='D')
然后创建一个 `DataFrame` 结构:
In[ ]:
df = pd.DataFrame(np.random.randn(6,4))
Df
| 0 | 1 | 2 | 3 |
0 | -0.102616 | 0.375380 | -0.070463 | -0.846658 |
1 | 0.187899 | 0.782631 | 0.189112 | -1.587307 |
2 | 2.211209 | -1.306437 | -0.349325 | 0.853832 |
3 | -0.728678 | 0.002916 | 0.128883 | -0.267226 |
4 | 0.887530 | 0.024770 | 1.469769 | 0.629591 |
5 | -0.865916 | 0.255379 | 0.916418 | 0.196589 |
In[ ]:
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
| A | B | C | D |
2017-01-01 | -0.143635 | 1.783327 | -1.586371 | 0.707324 |
2017-01-02 | 0.680199 | 0.654979 | 0.526456 | -0.774326 |
2017-01-03 | -1.883637 | -1.479862 | 0.270002 | -0.817198 |
2017-01-04 | -1.362639 | 0.454866 | -0.515825 | -0.275336 |
2017-01-05 | -0.947599 | -0.050093 | 1.158707 | -0.865189 |
2017-01-06 | -0.071648 | 0.238710 | 0.212805 | 1.136722 |
默认情况下,如果不指定 `index` 参数和 `columns`,那么他们的值将用从 `0` 开始的数字替代。
除了向 `DataFrame` 中传入二维数组,我们也可以使用字典传入数据:(只需要,要求同一列的数据类型相同)
In[ ]:
df2 = pd.DataFrame({'A':
1.,
'B'
:
pd.Timestamp('20130102'),
'C'
:
pd.Series(1,index=list(range(4)),dtype='float32'),
'D'
:
np.array([3]
*
4,dtype='int32'),
'E'
:
pd.Categorical(["test","train","test","train"]),
'F'
:
'foo'
})
df2
| A | B | C | D | E | F |
0 | 1.0 | 2013-01-02 | 1.0 | 3 | test | foo |
1 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
2 | 1.0 | 2013-01-02 | 1.0 | 3 | test | foo |
3 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
字典的每个 `key` 代表一列,其 `value` 可以是各种能够转化为 `Series` 的对象。
与 `Series` 要求所有的类型都一致不同,`DataFrame` 值要求每一列数据的格式相同:
In[ ]:
df2.dtypes #查看数据类型
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
查看数据
头尾数据
head` 和 `tail` 方法可以分别查看最前面几行和最后面几行的数据(默认为 5):
In[ ]:
df.head()
| A | B | C | D |
2017-01-01 | 1.213420 | 0.694119 | 2.125089 | 0.986451 |
2017-01-02 | -0.372771 | 0.808427 | 1.066514 | -1.170940 |
2017-01-03 | 0.049257 | -1.648947 | 1.022164 | 0.108233 |
2017-01-04 | -0.860449 | 0.227725 | 1.159682 | 1.244478 |
2017-01-05 | -0.903545 | -1.201852 | -1.046632 | 0.063163 |
#最后 3 行:
In[ ]:
df.tail(3)
| A | B | C | D |
2017-01-04 | -0.860449 | 0.227725 | 1.159682 | 1.244478 |
2017-01-05 | -0.903545 | -1.201852 | -1.046632 | 0.063163 |
2017-01-06 | -0.705212 | -0.932809 | 0.288205 | -0.401308 |
下标,列标,数据
# 下标使用 `index` 属性查看:
In[ ]:
df.index
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-06'],
dtype='datetime64[ns]', freq='D')
# 列标使用 `columns` 属性查看:
In[ ]:
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
# 数据值使用 `values` 查看:
In[ ]:
df.values
array([[ 1.21342008, 0.69411908, 2.12508885, 0.98645103],
[-0.37277063, 0.80842712, 1.06651382, -1.17094025],
[ 0.04925703, -1.64894713, 1.02216368, 0.10823307],
[-0.86044928, 0.22772503, 1.1596821 , 1.2444777 ],
[-0.9035446 , -1.20185242, -1.04663217, 0.06316338],
[-0.70521154, -0.93280946, 0.2882054 , -0.40130817]])
1.4 pandas读取数据及数据操作
这里以电影评分为例:(随机摘取):
In[ ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv(r'file:///home/ccoy/Documents/homework/movies.csv') #读取数据
df.head(1)
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 |
In[ ]:
df.iloc[0]
电影名称 阿凡达5:追寻伊娃
主演 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大...
导演 詹姆斯·卡梅隆
豆瓣评分 9.0
豆瓣投票数 1655
类型 动作/科幻/奇幻/冒险
片长 0
产地 美国
上映日期 2027/12/17
Name: 0, dtype: object
In[ ]:
df.iloc[0:2]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0 | 美国 | 2026/12/18 |
In[ ]:
df.loc[0:2] #loc是全闭区间,2在之类
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0 | 美国 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2025/12/19 |
In[ ]:
dit={'电影名称':'复仇者联盟3','主演':'小罗伯特·唐尼','导演':'安东尼·罗素','豆瓣评分':8.7,'豆瓣投票数':153456,'类型':'剧情/科幻','片长':142,'产地':'美国','上映日期':'20180504' }
s=pd.Series(dit)
s.name=140352 #变量最后一行数字加1
s #确认添加的数据
电影名称 复仇者联盟3
主演 小罗伯特·唐尼
导演 安东尼·罗素
豆瓣评分 8.7
豆瓣投票数 153456
类型 剧情/科幻
片长 142
产地 美国
上映日期 20180504
Name: 140352, dtype: object
In[ ]:
df=df.append(s) #覆盖原来数据
df[-5:] #查看后五行
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
140348 | 番茄杀手 - 电影 | NaN | NaN | 0.0 | 0 | NaN | 0 | NaN | NaN |
140349 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0 | 剧情/动作 | 60 | 美国 | NaN |
140350 | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0 | 喜剧 | 0 | 丹麦 | NaN |
140351 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019 | 剧情/家庭/奇幻/冒险 | 125 | 美国 | 2003/12/4 |
140352 | 复仇者联盟3 | 小罗伯特·唐尼 | 安东尼·罗素 | 8.7 | 153456 | 剧情/科幻 | 142 | 美国 | 20180504 |
In[ ]:
df=df.drop([140352]) #删除一行,使用drop方法
df[-5:]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
140347 | Pretty Boy and Rosa - 电影 | NaN | NaN | 0.0 | 0 | NaN | 0 | NaN | NaN |
140348 | 番茄杀手 - 电影 | NaN | NaN | 0.0 | 0 | NaN | 0 | NaN | NaN |
140349 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0 | 剧情/动作 | 60 | 美国 | NaN |
140350 | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0 | 喜剧 | 0 | 丹麦 | NaN |
140351 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019 | 剧情/家庭/奇幻/冒险 | 125 | 美国 | 2003/12/4 |
In[ ]:
df.columns
Index(['电影名称', '主演', '导演', '豆瓣评分', '豆瓣投票数', '类型', '片长', '产地', '上映日期'], dtype='object')
In[ ]:
df['电影名称'] #查看‘电影名称’的值
0 阿凡达5:追寻伊娃
1 未定名新星球大战三部曲第三部
2 阿凡达4:祖古骑士
3 未定名星球大战项目2
4 阿凡达3:带种者
...
140347 Pretty Boy and Rosa - 电影
140348 番茄杀手 - 电影
140349 Fast Track - 电影
140350 7-9-13 - 电影
140351 大鱼 - 电影
Name: 电影名称, Length: 140352, dtype: object
In[ ]:
df['电影名称'][:3] #查看‘电影名称’前面3个的值
0 阿凡达5:追寻伊娃
1 未定名新星球大战三部曲第三部
2 阿凡达4:祖古骑士
Name: 电影名称, dtype: object
In[ ]:
df[['电影名称', '上映日期']][:3] #查看多列,需要以list格式
| 电影名称 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 2025/12/19 |
In[ ]:
df['序号']=range(1,len(df)+1) #添加“序号”列,range自动添加,总数需要+1操作
df[:3]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 序号 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 | 1 |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0 | 美国 | 2026/12/18 | 2 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2025/12/19 | 3 |
In[ ]:
df=df.drop('序号',axis=1) #删除“序号”列
df[-3:]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
140349 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0 | 剧情/动作 | 60 | 美国 | NaN |
140350 | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0 | 喜剧 | 0 | 丹麦 | NaN |
140351 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019 | 剧情/家庭/奇幻/冒险 | 125 | 美国 | 2003/12/4 |
df.loc[[index],[colunm]]通过标签选择数据
In[ ]:
df.loc[1,'电影名称'] #取出一行一列
'未定名新星球大战三部曲第三部'
In[ ]:
df.loc[[1,3,5,7,9],['电影名称','豆瓣评分']] #多行多列
| 电影名称 | 豆瓣评分 |
1 | 未定名新星球大战三部曲第三部 | 6.0 |
3 | 未定名星球大战项目2 | 8.0 |
5 | 未定名新星球大战三部曲第一部 | 8.0 |
7 | 海王2 | 8.0 |
9 | 老虎的学徒 | 8.0 |
In[ ]:
df['产地']=='美国' #选取产地为美国的所有电影
0 True
1 True
2 True
3 True
4 True
...
140347 False
140348 False
140349 True
140350 False
140351 True
Name: 产地, Length: 140352, dtype: bool
In[ ]:
df[df['产地']=='美国'][:3] #选取产地为美国的所有电影,前3条
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0 | 美国 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2025/12/19 |
选取产地为美国的所有电影,并且评分大于9分的电影:
In[ ]:
df[(df.产地=='美国')&(df.豆瓣评分>9)][:3] #选取产地为美国的所有电影,前3条
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
5706 | 探险活宝之钻石与柠檬 | 杰里米·沙达/约翰·迪·马吉欧/汤姆·肯尼/奥利维亚·奥尔森/贾斯汀·罗兰/海登·瓦尔希/彭... | NaN | 9.2 | 85 | 喜剧/动画 | 11 | 美国 | 2018/7/20 |
16048 | 人鼠之间 | 詹姆斯·弗兰科/克里斯·奥多德/莉顿·梅斯特/吉姆·诺顿 | NaN | 9.1 | 774 | 剧情/喜剧 | 150 | 美国 | 2015/2/22 |
20121 | 改变美国的一夜:格莱美向披头士致敬演出 | 保罗·麦卡特尼/林哥·斯塔尔 | NaN | 9.2 | 456 | 音乐/传记 | 150 | 美国 | 2014/2/9 |
选取产地为美国或中国大陆的所有电影,并且评分大于9分的电影:
In[ ]:
df[((df.产地=='美国')|(df.产地=='中国大陆'))&(df.豆瓣评分>9)][:3]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
5706 | 探险活宝之钻石与柠檬 | 杰里米·沙达/约翰·迪·马吉欧/汤姆·肯尼/奥利维亚·奥尔森/贾斯汀·罗兰/海登·瓦尔希/彭... | NaN | 9.2 | 85 | 喜剧/动画 | 11 | 美国 | 2018/7/20 |
10818 | 狐妖小红娘剧场版:月红篇 | 杨天翔/刘校妤/阿杰/张予佟/张凯/乔诗语/宝木中阳/图特哈蒙 | 王昕/董易 | 9.3 | 4010 | 爱情/动画/奇幻 | 227 | 中国大陆 | 2016/6/24 |
12884 | 狐妖小红娘剧场版:王权富贵 | 杨天翔/刘校妤/乔诗语/魏超/阎萌萌/张凯/范哲琛 | 王昕 | 9.2 | 4166 | 剧情/喜剧/爱情 | 160 | 中国大陆 | 2016/5/20 |
1.5 缺失值及异常值处理
In[ ]:
df.isnull() #是否是缺失的判断
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | False | False | False | False | False | False | False | False | False |
1 | False | True | False | False | False | False | False | False | False |
2 | False | False | False | False | False | False | False | False | False |
3 | False | True | True | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
140347 | False | True | True | False | False | True | False | True | True |
140348 | False | True | True | False | False | True | False | True | True |
140349 | False | False | False | False | False | False | False | False | True |
140350 | False | True | True | False | False | False | False | False | True |
140351 | False | False | False | False | False | False | False | False | False |
140352 rows × 9 columns
In[ ]:
df['电影名称'].isnull() #确定列进行判断
0 False
1 False
2 False
3 False
4 False
...
140347 False
140348 False
140349 False
140350 False
140351 False
Name: 电影名称, Length: 140352, dtype: bool
In[ ]:
df[df['电影名称'].isnull()] #如果有缺失值,显示NaN
In[ ]:
df[df['豆瓣评分'].isnull()]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
35 | 阿娜 | 巩俐 | 马丁·坎贝尔 | NaN | 0.0 | 动作/惊悚/犯罪 | 0.0 | 美国 | NaN |
41 | 记忆碎片 | NaN | NaN | NaN | NaN | 悬疑/惊悚 | 0.0 | 美国 | NaN |
In[ ]:
df['豆瓣评分'].fillna(np.mean(df['豆瓣评分']),inplace=True) #用所有电影评分均值进行填充
df[df.电影名称=='阿娜']
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
35 | 阿娜 | 巩俐 | 马丁·坎贝尔 | 1.220817 | 0.0 | 动作/惊悚/犯罪 | 0.0 | 美国 | NaN |
df.dropna() 参数:
- how=‘all’ :删除全为空值的行或列
- inplace=True :覆盖之前的数据
- axis=0(默认为行):选择行或列
In[ ]:
len(df) #在删除操作之前,先确定数据的数量
140352
In[ ]:
df.dropna(inplace=True)
len(df)
46238
异常值,即在数据集中存在不合理的值,又称之为离群点。比如年龄为-1,电脑的重量为1吨等,都属于异常值的范围。
In[ ]:
df[df.豆瓣评分==0][:3] #查看豆瓣评分为0的值
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
96 | 破晓猎刃-追猎 | 喻强墙/沈圣泷/贾尧/张晨亮 | 陈瑛麟 Cylin. | 0.0 | 0.0 | 动作/悬疑/惊悚/战争 | 112.0 | 中国大陆 | 2024/11/30 |
131 | 疾速追杀4 | 基努·里维斯 | 查德·斯塔赫斯基 | 0.0 | 0.0 | 动作/惊悚/犯罪 | 0.0 | 美国 | 2021/5/21 |
141 | 蝙蝠侠 | 罗伯特·帕丁森 | 马特·里夫斯 | 0.0 | 0.0 | 剧情/动作/科幻/犯罪 | 0.0 | 美国 | 2021/6/25 |
In[ ]:
df[df['豆瓣投票数']%1!=0] #查看豆瓣投票数有小数的值
df = df[df.豆瓣评分>0] #如果不是数据筛选,测试中不要操作
df = df['豆瓣投票数']%1==0 #如果不是数据筛选,测试中不要操作
对于异常值,一般来说数量都会很少,在不影响数据分布情况下,我们直接删除就可以了。
In[ ]:
df.to_csv('电影修改.csv') #文件,将保存在当前文件夹
第二篇
2.1 数据格式转换
在做数据分析的时候,原始数据往往会因为各种各样的原因产生各种数据格式的问题。
数据格式是我们非常注意的一点,数据格式错误往往会造成严重的后果。并且,很多异常值也是我们经过格式转换之后才会发现,对我们规整数据、清洗数据有着重要的作用。
读取数据
In[ ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv(r'file:///home/ccoy/Documents/homework/movies.csv') #读取数据
df[:5] #查看数据
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 |
3 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 | 美国 | 2024/12/20 |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 |
In[ ]:
df['豆瓣投票数'].dtype
dtype('float64')
In[ ]:
df.replace(np.nan, 0, inplace=True) #np.nan或者np.inf都是float的类型,而且无法转成int,会报错
df.replace(np.inf, 0, inplace=True) #可以,先把nan或者inf替换成0
df['豆瓣投票数']=df['豆瓣投票数'].astype('int') #转换为整数格式
df[:5] #查看数据
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0.0 | 美国 | 2024/12/20 |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 |
接下来,对“产地”转换格式为字符串“str”
In[ ]:
df['产地'].dtype #查看产地格式
dtype('O')
In[ ]:
df['产地']=df['产地'].astype('str') #转换为字符串格式
将年份转化为整数格式
报错
将时长转化为整数格式
In[ ]:
df['片长']=df['片长'].astype('int') #转换为整数格式
2.2 排序
默认排序
In[ ]:
df[:5] #根据序列排序,也就是按照index进行
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2027/12/17 |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0 | 美国 | 2026/12/18 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2025/12/19 |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0 | 美国 | 2024/12/20 |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0 | 美国 | 2023/12/22 |
按照豆瓣投票数进行排序
In[ ]:
df.sort_values(by='豆瓣投票数')[-3:] #默认是升序排列
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
105632 | 流浪地球 - 电影 | 屈楚萧/吴京/李光洁/吴孟达/赵今麦/隋凯/屈菁菁/张亦驰/杨皓宇/阿尔卡基·沙罗格拉茨基/... | 郭帆 | 0.0 | 1264367 | 科幻/灾难 | 125 | 中国大陆 | 2019/2/5 |
99814 | 这个杀手不太冷 - 电影 | 让·雷诺/娜塔莉·波特曼/加里·奥德曼/丹尼·爱罗/彼得·阿佩尔/迈克尔·巴达鲁科/艾伦·格... | 吕克·贝松 | 0.0 | 1376829 | 剧情/动作/犯罪 | 110 | 法国 | 1994/9/14 |
103109 | 肖申克的救赎 - 电影 | 蒂姆·罗宾斯/摩根·弗里曼/鲍勃·冈顿/威廉姆·赛德勒/克兰西·布朗/吉尔·贝罗斯/马克·罗... | 弗兰克·德拉邦特 | 0.0 | 1523334 | 剧情/犯罪 | 142 | 美国 | 1994/9/10 |
In[ ]:
df.sort_values(by='豆瓣投票数',ascending=False)[:3] #ascending=False,降序排列
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
103109 | 肖申克的救赎 - 电影 | 蒂姆·罗宾斯/摩根·弗里曼/鲍勃·冈顿/威廉姆·赛德勒/克兰西·布朗/吉尔·贝罗斯/马克·罗... | 弗兰克·德拉邦特 | 0.0 | 1523334 | 剧情/犯罪 | 142 | 美国 | 1994/9/10 |
99814 | 这个杀手不太冷 - 电影 | 让·雷诺/娜塔莉·波特曼/加里·奥德曼/丹尼·爱罗/彼得·阿佩尔/迈克尔·巴达鲁科/艾伦·格... | 吕克·贝松 | 0.0 | 1376829 | 剧情/动作/犯罪 | 110 | 法国 | 1994/9/14 |
105632 | 流浪地球 - 电影 | 屈楚萧/吴京/李光洁/吴孟达/赵今麦/隋凯/屈菁菁/张亦驰/杨皓宇/阿尔卡基·沙罗格拉茨基/... | 郭帆 | 0.0 | 1264367 | 科幻/灾难 | 125 | 中国大陆 | 2019/2/5 |
按照上映时间进行排序
In[ ]:
df.sort_values(by='上映日期')[-8:-3]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0 | 美国 | 2023/12/22 |
96 | 破晓猎刃-追猎 | 喻强墙/沈圣泷/贾尧/张晨亮 | 陈瑛麟 Cylin. | 0.0 | 0 | 动作/悬疑/惊悚/战争 | 112 | 中国大陆 | 2024/11/30 |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0 | 美国 | 2024/12/20 |
115262 | 未定名新星球大战三部曲第二部 - 电影 | 0 | 莱恩·约翰逊 | 0.0 | 0 | 科幻 | 0 | 美国 | 2024/12/20 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0 | 美国 | 2025/12/19 |
多个值的排序,先按照豆瓣评分,再按照投票人数进行排序
In[ ]:
df.sort_values(by=['豆瓣评分','豆瓣投票数'],ascending=False)[:5]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
64006 | 是,大臣 1984圣诞特辑 | 保罗·爱丁顿/奈杰尔·霍桑/德里克·福德斯/戴安娜·霍迪诺特/约翰·内特尔顿/詹姆斯·格劳特... | 彼得·惠特莫尔 | 9.8 | 3965 | 喜剧 | 60 | 英国 | 1984/12/17 |
48104 | 张国荣热·情演唱会 | 张国荣 | 0 | 9.7 | 714 | 音乐/歌舞 | 118 | 中国香港 / 中国大陆 | 2000/7/31 |
60024 | 张国荣告别演唱会 | 张国荣 | 0 | 9.7 | 423 | 音乐/歌舞 | 146 | 中国香港 | 1989/12/21 |
41818 | 周杰伦无与伦比演唱会 | 周杰伦 | 0 | 9.7 | 73 | 音乐 | 145 | 中国台湾 | 2004/10/2 |
56133 | 霸王别姬 | 张国荣/张丰毅/巩俐/葛优/英达/蒋雯丽/吴大维/吕齐/雷汉/尹治/马明威/费振翔/智一桐/... | 陈凯歌 | 9.6 | 1167141 | 剧情/爱情/同性 | 171 | 中国大陆 / 中国香港 | 1993/1/1 |
2.3 基础统计分析
(1)描述性统计分析
DataFrame.describe(percentiles=None, include=None, exclude=None)
对dataframe中的数值型数据进行描述性统计分析,其物理意义在于观察这一系列数据的范围、大小、波动趋势等等,便于判断后续对数据采取哪类模型更合适。
In[ ]:
df.describe() #对数值型数据进行指标计算
| 豆瓣评分 | 豆瓣投票数 | 片长 |
count | 140352.000000 | 1.403520e+05 | 140352.000000 |
mean | 1.220799 | 2.561700e+03 | 62.106212 |
std | 2.622107 | 2.407849e+04 | 66.251287 |
min | 0.000000 | 0.000000e+00 | 0.000000 |
25% | 0.000000 | 0.000000e+00 | 0.000000 |
50% | 0.000000 | 0.000000e+00 | 83.000000 |
75% | 0.000000 | 6.000000e+01 | 97.000000 |
max | 9.800000 | 1.523334e+06 | 14400.000000 |
通过描述性分析,可以发现一些异常值。
In[ ]:
df[df['片长']>1000]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 |
27428 | 现代文明永不消逝 | 0 | 0 | 0.0 | 0 | 科幻 | 14400 | 丹麦 | 2011/3/24 |
46532 | 歌德:浮士德2 | 布鲁诺·甘茨/多萝特·哈廷格 | 0 | 0.0 | 0 | 剧情 | 1320 | 德国 | 2001/2/18 |
61834 | 失眠妙方 | 0 | 0 | 7.6 | 154 | 剧情 | 5220 | 美国 | 1987/1/31 |
68904 | 世纪纪念 | 雷蒙德·布尔/芭芭拉·卡勒拉/理查德·查伯兰 | 维吉尔·W·沃格尔/保罗·克拉斯尼 | 0.0 | 0 | 剧情/动作/冒险 | 1256 | 美国 | 1978/10/1 |
73550 | 间谍力量 | 杰克·汤普森/雷德蒙德·菲利普斯 | 0 | 0.0 | 0 | 剧情/战争 | 2100 | 澳大利亚 | 0 |
100367 | 莎利文一家 - 电影 | 0 | 0 | 0.0 | 0 | 剧情/战争 | 1470 | 澳大利亚 | 0 |
132591 | 侦探 - 电影 | 0 | 0 | 0.0 | 0 | 犯罪 | 2850 | 俄罗斯 | 0 |
135035 | 土耳其进行曲 - 电影 | 0 | 米哈伊尔·图曼尼什维利 | 0.0 | 0 | 犯罪 | 4230 | 俄罗斯 | 2001/2/1 |
对于异常值,可以通过其index判断,调用drop方法删除。
In[ ]:
df.drop(df[df['片长']>1000].index,inplace=True)
数据已经修改,序列也改变了,对index重新进行赋值!
In[ ]:
df.index = range(len(df))
(2)最值
In[ ]:
df['豆瓣投票数'].max() #最大值
1523334
In[ ]:
df['豆瓣投票数'].min() #最小值
0
In[ ]:
df['豆瓣投票数'].mean() #均值
2561.845073533603
In[ ]:
df['豆瓣投票数'].median() #中位数
0.0
(4)方差和标准差
In[ ]:
df['豆瓣评分'].var() #方差
6.875473493358182
In[ ]:
df['豆瓣评分'].std() #标准差
2.622112410511453
(5)求和
In[ ]:
df['豆瓣投票数'].sum() #求和
359539585
(6)相关系数、协方差
In[ ]:
df[['豆瓣投票数','豆瓣评分']].corr() #相关性
| 豆瓣投票数 | 豆瓣评分 |
豆瓣投票数 | 1.000000 | 0.126017 |
豆瓣评分 | 0.126017 | 1.000000 |
In[ ]:
df[['豆瓣投票数','豆瓣评分']].cov() #协方差
| 豆瓣投票数 | 豆瓣评分 |
豆瓣投票数 | 5.798062e+08 | 7956.513952 |
豆瓣评分 | 7.956514e+03 | 6.875473 |
(7)计数
In[ ]:
len(df) #计数,总数
140344
In[ ]:
len(df['产地'].unique()) #计数,唯一值的数量
4496
对于一些异常值,需要替换,比如一些国家的不同名称:
df['产地'].replace('USA','美国',inplace=True)
df['产地'].replace(['USA','苏联','西德'],['美国','俄罗斯','德国'],inplace=True) #注意,对应匹配
计算每一年的电影数量
比如,对上映时间的统计,也是一样:
In[ ]:
df['上映日期'].value_counts()
0 62649
2018/9/7 56
2017/9/8 50
2016/9/2 49
2016/9/9 48
...
1977/3/4 1
1973/4/2 1
1961/12/12 1
1946/10/30 1
1982/12/31 1
Name: 上映日期, Length: 22127, dtype: int64
电影产出前5的国家或地区:
In[ ]:
df['产地'].value_counts()[:5]
美国 36872
中国大陆 14050
日本 13672
英国 7956
法国 7426
Name: 产地, dtype: int64
2.4 数据透视
Excel中数据透视表的使用非常广泛了,其实Pandas也提供了一个类似的功能,名为pivot_table。
pivot_table非常有用,将重点解释padas中的函数pivot_table。
使用padas的pivot_table的一个挑战是,需要确保理解你的数据,并清楚的知道想通过透视表解决什么问题,虽然pivot_table看起来只是一个简单的函数,但它能够快速地对数据进行强大的分析。
1、基础形式
In[ ]:
pd.pivot_table(df,index = ['上映日期']) #根据上映日期做索引,均值
| 片长 | 豆瓣投票数 | 豆瓣评分 |
上映日期 |
|
|
|
0 | 42.981883 | 98.080799 | 0.312833 |
1894-10-09 | 0.000000 | 0.000000 | 0.000000 |
1906/12/26 | 70.000000 | 0.000000 | 0.000000 |
1908/2/15 | 0.000000 | 0.000000 | 0.000000 |
1909/1/1 | 3.000000 | 0.000000 | 0.000000 |
... | ... | ... | ... |
2024/11/30 | 112.000000 | 0.000000 | 0.000000 |
2024/12/20 | 0.000000 | 947.500000 | 4.000000 |
2025/12/19 | 0.000000 | 22.000000 | 5.000000 |
2026/12/18 | 0.000000 | 153.000000 | 3.000000 |
2027/12/17 | 0.000000 | 1655.000000 | 9.000000 |
22127 rows × 3 columns
pd.set_option('max_columns',100) #允许最大输出列、行(设置)
pd.set_option('max_rows',500)
2、多个索引
In[ ]:
pd.pivot_table(df,index = ['上映日期','产地'])
|
| 片长 | 豆瓣投票数 | 豆瓣评分 |
上映日期 | 产地 |
|
|
|
0 | 0 | 0.0 | 0.0 | 0.0 |
Albania / 意大利 | 0.0 | 0.0 | 0.0 | |
Algeria / 法国 | 52.5 | 0.0 | 0.0 | |
Algeria / 法国 / 德国 / 瑞士 | 0.0 | 0.0 | 0.0 | |
Algeria / 美国 | 0.0 | 0.0 | 0.0 | |
... | ... | ... | ... | ... |
2024/11/30 | 中国大陆 | 112.0 | 0.0 | 0.0 |
2024/12/20 | 美国 | 0.0 | 947.5 | 4.0 |
2025/12/19 | 美国 | 0.0 | 22.0 | 5.0 |
2026/12/18 | 美国 | 0.0 | 153.0 | 3.0 |
2027/12/17 | 美国 | 0.0 | 1655.0 | 9.0 |
58136 rows × 3 columns
3、指定统计汇总的数据
In[ ]:
pd.pivot_table(df,index = ['上映日期','产地'],values=['豆瓣评分'])
|
| 豆瓣评分 |
上映日期 | 产地 |
|
0 | 0 | 0.0 |
Albania / 意大利 | 0.0 | |
Algeria / 法国 | 0.0 | |
Algeria / 法国 / 德国 / 瑞士 | 0.0 | |
Algeria / 美国 | 0.0 | |
... | ... | ... |
2024/11/30 | 中国大陆 | 0.0 |
2024/12/20 | 美国 | 4.0 |
2025/12/19 | 美国 | 5.0 |
2026/12/18 | 美国 | 3.0 |
2027/12/17 | 美国 | 9.0 |
58136 rows × 1 columns
4、指定函数,统计不同的统计值
In[ ]:
pd.pivot_table(df,index=['产地','电影名称'],values=['豆瓣投票数'],aggfunc=np.sum)[-5:]
|
| 豆瓣投票数 |
产地 | 电影名称 |
|
黎巴嫩 / 法国 / 卡塔尔 | 荣誉的人 | 0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 炸弹枕边人 | 123 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 听风者之歌 | 290 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 羞辱 | 11725 |
黎巴嫩 / 法国 / 美国 | 何以为家 - 电影 | 341376 |
通过将“投票人数”和“评分”列进行对应分组,对“产地”实现数据聚合和总结。
In[ ]:
pd.pivot_table(df,index=['产地'],values=['豆瓣投票数','豆瓣评分'],aggfunc=[np.sum,np.mean])[-5:]
| sum | mean | ||
| 豆瓣投票数 | 豆瓣评分 | 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
|
|
黎巴嫩 / 法国 / 卡塔尔 | 0 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 123 | 7.3 | 123.0 | 7.3 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 290 | 7.2 | 290.0 | 7.2 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 11725 | 8.3 | 11725.0 | 8.3 |
黎巴嫩 / 法国 / 美国 | 341376 | 0.0 | 341376.0 | 0.0 |
5、非数值(NaN)难以处理,使用“fill_value”将其设置为0
In[ ]:
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0)
| sum | mean | ||||
| 片长 | 豆瓣投票数 | 豆瓣评分 | 片长 | 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
|
|
|
|
0 | 0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 |
Albania | 104 | 100 | 6.7 | 104.0 | 100.0 | 6.7 |
Albania / 德国 | 93 | 0 | 0.0 | 93.0 | 0.0 | 0.0 |
Albania / 意大利 | 0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 |
Albania / 法国 / 德国 | 90 | 0 | 0.0 | 90.0 | 0.0 | 0.0 |
... | ... | ... | ... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 102 | 123 | 7.3 | 102.0 | 123.0 | 7.3 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 105 | 290 | 7.2 | 105.0 | 290.0 | 7.2 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 113 | 11725 | 8.3 | 113.0 | 11725.0 | 8.3 |
黎巴嫩 / 法国 / 美国 | 126 | 341376 | 0.0 | 126.0 | 341376.0 | 0.0 |
4493 rows × 6 columns
6、加入margins=True,可以在下方加入总和数据
In[ ]:
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
| sum | mean | ||||
| 片长 | 豆瓣投票数 | 豆瓣评分 | 片长 | 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
|
|
|
|
0 | 0 | 0 | 0.0 | 0.000000 | 0.000000 | 0.000000 |
Albania | 104 | 100 | 6.7 | 104.000000 | 100.000000 | 6.700000 |
Albania / 德国 | 93 | 0 | 0.0 | 93.000000 | 0.000000 | 0.000000 |
Albania / 意大利 | 0 | 0 | 0.0 | 0.000000 | 0.000000 | 0.000000 |
Albania / 法国 / 德国 | 90 | 0 | 0.0 | 90.000000 | 0.000000 | 0.000000 |
... | ... | ... | ... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 102 | 123 | 7.3 | 102.000000 | 123.000000 | 7.300000 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 105 | 290 | 7.2 | 105.000000 | 290.000000 | 7.200000 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 113 | 11725 | 8.3 | 113.000000 | 11725.000000 | 8.300000 |
黎巴嫩 / 法国 / 美国 | 126 | 341376 | 0.0 | 126.000000 | 341376.000000 | 0.000000 |
All | 8683885 | 359539585 | 171334.0 | 61.875713 | 2561.845074 | 1.220815 |
4494 rows × 6 columns
7、对不同值执行不同的函数,可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加简洁才行。
In[ ]:
pd.pivot_table(df,index=['产地'],values=['豆瓣投票数','豆瓣评分'],aggfunc={'豆瓣投票数':np.sum,'豆瓣评分':np.mean},fill_value=0)
| 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
0 | 0 | 0.0 |
Albania | 100 | 6.7 |
Albania / 德国 | 0 | 0.0 |
Albania / 意大利 | 0 | 0.0 |
Albania / 法国 / 德国 | 0 | 0.0 |
... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 123 | 7.3 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 290 | 7.2 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 11725 | 8.3 |
黎巴嫩 / 法国 / 美国 | 341376 | 0.0 |
4493 rows × 2 columns
数据透视表过滤
In[ ]:
table1=pd.pivot_table(df,index=['产地'],values=['豆瓣投票数','豆瓣评分'],aggfunc={'豆瓣投票数':np.sum,'豆瓣评分':np.mean},fill_value=0)
type(table1)
pandas.core.frame.DataFrame
In[ ]:
table1[:5]
| 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
0 | 0 | 0.0 |
Albania | 100 | 6.7 |
Albania / 德国 | 0 | 0.0 |
Albania / 意大利 | 0 | 0.0 |
Albania / 法国 / 德国 | 0 | 0.0 |
如果,我们对“美国”电影比较感兴趣
In[ ]:
table1[table1.index == '美国']
| 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
美国 | 94829605 | 1.147521 |
同样,对于豆瓣评分排序(降序):
In[ ]:
table1.sort_values('豆瓣评分',ascending=False)[:8]
| 豆瓣投票数 | 豆瓣评分 |
产地 |
|
|
日本 / 瑞典 | 76 | 9.2 |
法国 / 德国 / 英国 / 波兰 | 298294 | 9.1 |
法国 / 意大利 / 西德 / 加拿大 / 英国 | 492 | 9.1 |
南斯拉夫联邦共和国 / 法国 / 德国 / 保加利亚 / 捷克 / 匈牙利 / 英国 / 美国 | 33008 | 9.1 |
法国 / 希腊 / 意大利 / 德国 / 英国 / 南斯拉夫 / 波黑 / 阿尔巴尼亚 / 罗马尼亚 | 4784 | 9.0 |
法国 / 意大利 / 希腊 / 德国 | 17368 | 9.0 |
捷克斯洛伐克 / 加拿大 | 589 | 9.0 |
俄罗斯 / 英国 / 法国 | 160 | 8.9 |
同样,可以按照多个索引进行汇总。
第三篇
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
a 1 1
2 2
3 3
b 1 4
2 5
c 3 6
1 7
d 2 8
3 9
dtype: int64
In[ ]:
s.index
MultiIndex([('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 3),
('c', 1),
('d', 2),
('d', 3)],
)
In[ ]:
s['a']
1 1
2 2
3 3
dtype: int64
In[ ]:
s['a':'c'] #切片
a 1 1
2 2
3 3
b 1 4
2 5
c 3 6
1 7
dtype: int64
内层选取
In[ ]:
s[:,1] #内层选取
a 1
b 4
c 7
dtype: int64
In[ ]:
s['c',3] #层次化索引
6
通过unstack方法将series变成DataFrame
通过stack方法复原
data.unstack().stack() #通过stack方法,可以将DataFrame变成Series,它是unstack的逆运算
2、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
|
| 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']
|
| Z | X |
a | 1 | 0 | 1 |
2 | 3 | 4 | |
b | 1 | 6 | 7 |
2 | 9 | 10 |
In[ ]:
#对于dataframe,每条轴都可以分层索引,各层都可以有自己的名字的
data.index.names =["row1","row2"]
data.columns.names =["column1","column2"]
data
| column1 | A | B | |
| column2 | Z | X | C |
row1 | row2 |
|
|
|
a | 1 | 0 | 1 | 2 |
2 | 3 | 4 | 5 | |
b | 1 | 6 | 7 | 8 |
2 | 9 | 10 | 11 |
In[ ]:
#对"row1","row2"的顺序进行调整
data.swaplevel =["row1","row2"]
3、了解了层次化索引的基本认识之后,尝试将电影数据处理成多层索引结构
In[ ]:
df.index
RangeIndex(start=0, stop=140352, step=1)
把产地和年代同时设为索引,产地为外层索引,年代为内层索引
set_index
可以把列变为索引
In[ ]:
df=df.set_index(['产地','上映日期'])
df
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | |
产地 | 上映日期 |
|
|
|
|
|
|
|
美国 | 2027/12/17 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 |
2026/12/18 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 | |
2025/12/19 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 | |
2024/12/20 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 | |
2023/12/22 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | |
... | ... | ... | ... | ... | ... | ... | ... | ... |
NaN | NaN | Pretty Boy and Rosa - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 |
NaN | 番茄杀手 - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 | |
美国 | NaN | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0.0 | 剧情/动作 | 60.0 |
丹麦 | NaN | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0.0 | 喜剧 | 0.0 |
美国 | 2003/12/4 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019.0 | 剧情/家庭/奇幻/冒险 | 125.0 |
140352 rows × 7 columns
reset_index
将索引变成列
In[ ]:
df.index[0]
('美国', '2027/12/17')
获取所有的美国电影,因为产地已经成为索引,用.loc方法
In[ ]:
df.loc['美国']
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 |
上映日期 |
|
|
|
|
|
|
|
2027/12/17 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 |
2026/12/18 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 |
2025/12/19 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 |
2024/12/20 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 |
2023/12/22 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 |
... | ... | ... | ... | ... | ... | ... | ... |
NaN | The F Word - 电影 | NaN | NaN | 0.0 | 0.0 | 喜剧/爱情 | 0.0 |
NaN | Date with Death - 电影 | NaN | NaN | 0.0 | 0.0 | 犯罪 | 84.0 |
NaN | The Paliser Case - 电影 | 波琳·弗雷德里克/艾伦·罗斯科 | NaN | 0.0 | 0.0 | 剧情/悬疑 | 50.0 |
NaN | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0.0 | 剧情/动作 | 60.0 |
2003/12/4 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019.0 | 剧情/家庭/奇幻/冒险 | 125.0 |
36872 rows × 7 columns
In[ ]:
df = df.swaplevel('产地','上映日期')
df
|
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 |
上映日期 | 产地 |
|
|
|
|
|
|
|
2027/12/17 | 美国 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 |
2026/12/18 | 美国 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 |
2025/12/19 | 美国 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 |
2024/12/20 | 美国 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 |
2023/12/22 | 美国 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
NaN | NaN | Pretty Boy and Rosa - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 |
NaN | 番茄杀手 - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 | |
美国 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0.0 | 剧情/动作 | 60.0 | |
丹麦 | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0.0 | 喜剧 | 0.0 | |
2003/12/4 | 美国 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019.0 | 剧情/家庭/奇幻/冒险 | 125.0 |
140352 rows × 7 columns
获取2023/12/22的电影
In[ ]:
df.loc['2023/12/22']
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 |
产地 |
|
|
|
|
|
|
|
美国 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 |
取消层次化索引
使用reset_index()
函数
In[ ]:
df=df.reset_index()
df[:5]
| 产地 | 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | |
0 | 2027/12/17 | 美国 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 |
1 | 2026/12/18 | 美国 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 |
2 | 2025/12/19 | 美国 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 |
3 | 2024/12/20 | 美国 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 |
4 | 2023/12/22 | 美国 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 |
4、数据旋转
dataframe可以使用stack和unstack,转化为层次化索引的series
行列转化:以前五部电影为例
In[ ]:
data=df[:5]
data
| 产地 | 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | |
0 | 2027/12/17 | 美国 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 |
1 | 2026/12/18 | 美国 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 |
2 | 2025/12/19 | 美国 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 |
3 | 2024/12/20 | 美国 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 |
4 | 2023/12/22 | 美国 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 |
用.T操作可以使数据行列转换(类似于矩阵的转置)
In[ ]:
data.T
| 0 | 1 | 2 | 3 | 4 |
上映日期 | 2027/12/17 | 2026/12/18 | 2025/12/19 | 2024/12/20 | 2023/12/22 |
产地 | 美国 | 美国 | 美国 | 美国 | 美国 |
电影名称 | 阿凡达5:追寻伊娃 | 未定名新星球大战三部曲第三部 | 阿凡达4:祖古骑士 | 未定名星球大战项目2 | 阿凡达3:带种者 |
主演 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | NaN | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | NaN | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... |
导演 | 詹姆斯·卡梅隆 | 莱恩·约翰逊 | 詹姆斯·卡梅隆 | NaN | 詹姆斯·卡梅隆 |
豆瓣评分 | 9.0 | 6.0 | 5.0 | 8.0 | 8.0 |
豆瓣投票数 | 1655.0 | 306.0 | 22.0 | 1895.0 | 1660.0 |
类型 | 动作/科幻/奇幻/冒险 | 动作/科幻 | 动作/科幻/奇幻/冒险 | 科幻 | 剧情/动作/科幻/奇幻/冒险 |
片长 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
dataframe可以使用stack和unstack,转化为层次化索引的series
In[ ]:
data.stack()
0 上映日期 2027/12/17
产地 美国
电影名称 阿凡达5:追寻伊娃
主演 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大...
导演 詹姆斯·卡梅隆
豆瓣评分 9.0
豆瓣投票数 1655.0
类型 动作/科幻/奇幻/冒险
片长 0.0
1 上映日期 2026/12/18
产地 美国
电影名称 未定名新星球大战三部曲第三部
导演 莱恩·约翰逊
豆瓣评分 6.0
豆瓣投票数 306.0
类型 动作/科幻
片长 0.0
2 上映日期 2025/12/19
产地 美国
电影名称 阿凡达4:祖古骑士
主演 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜...
导演 詹姆斯·卡梅隆
豆瓣评分 5.0
豆瓣投票数 22.0
类型 动作/科幻/奇幻/冒险
片长 0.0
3 上映日期 2024/12/20
产地 美国
电影名称 未定名星球大战项目2
豆瓣评分 8.0
豆瓣投票数 1895.0
类型 科幻
片长 0.0
4 上映日期 2023/12/22
产地 美国
电影名称 阿凡达3:带种者
主演 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜...
导演 詹姆斯·卡梅隆
豆瓣评分 8.0
豆瓣投票数 1660.0
类型 剧情/动作/科幻/奇幻/冒险
片长 0.0
dtype: object
如果要转回来:
data.stack().unstack()
3.2 数据分组,分组运算
GroupBy技术:实现数据的分组,分组运算,作用类似于数据透视表
In[ ]:
group=df.groupby(df['产地']) #定义一个分组变量group'产地'
type(group) #查看类型
pandas.core.groupby.generic.DataFrameGroupBy
可以计算分组后的各个统计量
计算平均值
In[ ]:
group.mean()
| 豆瓣评分 | 豆瓣投票数 | 片长 |
产地 |
|
|
|
Albania | 6.7 | 100.0 | 104.0 |
Albania / 德国 | 0.0 | 0.0 | 93.0 |
Albania / 意大利 | 0.0 | 0.0 | 0.0 |
Albania / 法国 / 德国 | 0.0 | 0.0 | 90.0 |
Algeria / 法国 | 0.0 | 0.0 | 88.6 |
... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 7.3 | 123.0 | 102.0 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 7.2 | 290.0 | 105.0 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 8.3 | 11725.0 | 113.0 |
黎巴嫩 / 法国 / 美国 | 0.0 | 341376.0 | 126.0 |
4495 rows × 3 columns
计算各个上映日期的平均豆瓣评分
In[ ]:
df['豆瓣评分'].groupby(df['上映日期']).mean()
上映日期
1894-10-09 0.0
1906/12/26 0.0
1908/2/15 0.0
1909/1/1 0.0
1909/12/4 0.0
...
2024/11/30 0.0
2024/12/20 4.0
2025/12/19 5.0
2026/12/18 3.0
2027/12/17 9.0
Name: 豆瓣评分, Length: 22127, dtype: float64
由于groupby只会对数值变量进行分组运算,对于时间类型的数据,可以先把年代/日期/时间转换为字符串astype('str')
In[ ]:
df['上映日期']=df['上映日期'].astype('str')
df.groupby(df['产地']).mean() #求均值
| 豆瓣评分 | 豆瓣投票数 | 片长 |
产地 |
|
|
|
Albania | 6.7 | 100.0 | 104.0 |
Albania / 德国 | 0.0 | 0.0 | 93.0 |
Albania / 意大利 | 0.0 | 0.0 | 0.0 |
Albania / 法国 / 德国 | 0.0 | 0.0 | 90.0 |
Algeria / 法国 | 0.0 | 0.0 | 88.6 |
... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 7.3 | 123.0 | 102.0 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 7.2 | 290.0 | 105.0 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 8.3 | 11725.0 | 113.0 |
黎巴嫩 / 法国 / 美国 | 0.0 | 341376.0 | 126.0 |
4495 rows × 3 columns
In[ ]:
df.groupby(df['产地']).median() #求中值(中位数)
| 豆瓣评分 | 豆瓣投票数 | 片长 |
产地 |
|
|
|
Albania | 6.7 | 100.0 | 104.0 |
Albania / 德国 | 0.0 | 0.0 | 93.0 |
Albania / 意大利 | 0.0 | 0.0 | 0.0 |
Albania / 法国 / 德国 | 0.0 | 0.0 | 90.0 |
Algeria / 法国 | 0.0 | 0.0 | 100.0 |
... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 7.3 | 123.0 | 102.0 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 7.2 | 290.0 | 105.0 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 8.3 | 11725.0 | 113.0 |
黎巴嫩 / 法国 / 美国 | 0.0 | 341376.0 | 126.0 |
4495 rows × 3 columns
传入多个分组变量
In[ ]:
df.groupby([df['产地'],df['上映日期']]).mean()
|
| 豆瓣评分 | 豆瓣投票数 | 片长 |
产地 | 上映日期 |
|
|
|
Albania | 1969/11/27 | 6.7 | 100.0 | 104.0 |
Albania / 德国 | 2005/11/1 | 0.0 | 0.0 | 93.0 |
Albania / 意大利 | nan | 0.0 | 0.0 | 0.0 |
Albania / 法国 / 德国 | 2004/5/14 | 0.0 | 0.0 | 90.0 |
Algeria / 法国 | 2002/10/1 | 0.0 | 0.0 | 100.0 |
... | ... | ... | ... | ... |
黎巴嫩 / 法国 / 卡塔尔 | 2012/3/29 | 0.0 | 0.0 | 0.0 |
黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 2012/9/1 | 7.3 | 123.0 | 102.0 |
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 2016/5/17 | 7.2 | 290.0 | 105.0 |
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 2017/8/31 | 8.3 | 11725.0 | 113.0 |
黎巴嫩 / 法国 / 美国 | 2019/4/29 | 0.0 | 341376.0 | 126.0 |
58143 rows × 3 columns
获得每个地区,每个上映阶段的评分的均值
In[ ]:
group=df['豆瓣评分'].groupby([df['产地'],df['上映日期']])
means=group.mean()
means
产地 上映日期
Albania 1969/11/27 6.7
Albania / 德国 2005/11/1 0.0
Albania / 意大利 nan 0.0
Albania / 法国 / 德国 2004/5/14 0.0
Algeria / 法国 2002/10/1 0.0
...
黎巴嫩 / 法国 / 卡塔尔 2012/3/29 0.0
黎巴嫩 / 法国 / 卡塔尔 / 比利时 2012/9/1 7.3
黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 2016/5/17 7.2
黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 2017/8/31 8.3
黎巴嫩 / 法国 / 美国 2019/4/29 0.0
Name: 豆瓣评分, Length: 58143, dtype: float64
series通过unstack方法转化为DataFrame,没有数据会产生缺失值
In[ ]:
means.unstack().T
产地 | Albania | Albania / 德国 | Albania / 意大利 | Albania / 法国 / 德国 | Algeria / 法国 | Algeria / 法国 / 德国 | Algeria / 法国 / 德国 / 瑞士 | Algeria / 美国 | Andorra / 西班牙 | Angola / 法国 / 葡萄牙 | ... | 黎巴嫩 / 德国 | 黎巴嫩 / 德国 / 阿联酋 | 黎巴嫩 / 意大利 | 黎巴嫩 / 法国 | 黎巴嫩 / 法国 / 加拿大 | 黎巴嫩 / 法国 / 卡塔尔 | 黎巴嫩 / 法国 / 卡塔尔 / 比利时 | 黎巴嫩 / 法国 / 卡塔尔 / 阿联酋 | 黎巴嫩 / 法国 / 塞浦路斯 / 比利时 / 美国 | 黎巴嫩 / 法国 / 美国 |
上映日期 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1894-10-09 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1906/12/26 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1908/2/15 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1909/1/1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1909/12/4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2024/12/20 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2025/12/19 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2026/12/18 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2027/12/17 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
nan | NaN | NaN | 0.0 | NaN | 0.0 | NaN | 0.0 | 0.0 | 0.0 | 0.0 | ... | NaN | NaN | NaN | NaN | 0.0 | NaN | NaN | NaN | NaN | NaN |
22128 rows × 4495 columns
3.3 离散化处理
在实际数据分析中,对某些数据我们往往并不关心数据的绝对取值,而只关心它所处的区间或等级。
比如可以把评分9分及以上的电影定义为A级,7—9分定义为B级等等
离散化也可以叫做分组,区间化,可以借助函数cut()实现
pd.cut()函数
pd.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
参数解释:
x:需要离散化的对象,一般为数值,series,Dataframe对象
bins:分组的依据
right:左区间开闭情况
include_lowest:右区间开闭情况
labels:是否用标记替代分组取值
retbins:返回x对应的bins的列表
precision:设置精度
用评分等级将数据分组
In[ ]:
labels=['E','D','C','B','A']
df['评分等级']=pd.cut(df['豆瓣评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])
df
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 评分等级 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655.0 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 | B |
1 | 未定名新星球大战三部曲第三部 | NaN | 莱恩·约翰逊 | 6.0 | 306.0 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 | C |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22.0 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 | D |
3 | 未定名星球大战项目2 | NaN | NaN | 8.0 | 1895.0 | 科幻 | 0.0 | 美国 | 2024/12/20 | B |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660.0 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 | B |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
140347 | Pretty Boy and Rosa - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 | NaN | NaN | NaN |
140348 | 番茄杀手 - 电影 | NaN | NaN | 0.0 | 0.0 | NaN | 0.0 | NaN | NaN | NaN |
140349 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0.0 | 剧情/动作 | 60.0 | 美国 | NaN | NaN |
140350 | 7-9-13 - 电影 | NaN | NaN | 0.0 | 0.0 | 喜剧 | 0.0 | 丹麦 | NaN | NaN |
140351 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019.0 | 剧情/家庭/奇幻/冒险 | 125.0 | 美国 | 2003/12/4 | NaN |
140352 rows × 10 columns
根据投票人数来刻画电影热门
同样可以根据投票人数来刻画电影热门,投票越多的热门程度越高
In[ ]:
bins=np.percentile(df['豆瓣投票数'][:20],[0,20,40,60,80,100]) #由于数据库原因,只能选择部分,选择前20条为例
df['热门程度']=pd.cut(df['豆瓣投票数'][:20],bins,labels=['E','D','C','B','A'])
df[:3]
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 热门程度 | 评分等级 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 | E | B |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 | E | C |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 | NaN | D |
关于numpy.percentile()
函数:
百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。 函数numpy.percentile()接受以下参数。
np.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=False)
a: 输入数组
q: 要计算的百分位数,在 0 ~ 100 之间
axis: 沿着它计算百分位数的轴
keepdims :bool是否保持维度不变
首先明确百分位数:第 p 个百分位数是这样一个值,它使得至少有 p% 的数据项小于或等于这个值,且至少有 (100-p)% 的数据项大于或等于这个值。
比如:
import numpy as np
a = np.array([[10, 7, 4], [3, 2, 1]])
print ('我们的数组是:')
print (a)
print ('调用 percentile() 函数:')
# 50% 的分位数,就是 a 里排序之后的中位数
print (np.percentile(a, 50))
# axis 为 0,在纵列上求
print (np.percentile(a, 50, axis=0))
# axis 为 1,在横行上求
print (np.percentile(a, 50, axis=1))
# 保持维度不变
print (np.percentile(a, 50, axis=1, keepdims=True))
离散化数据的应用:
大烂片:投票人数很多,但评分很低
In[ ]:
df[(df['热门程度']=='A')&(df['评分等级']=='E')]
找出高分冷门电影!
In[ ]:
df[(df['热门程度']=='E')&(df['评分等级']=='A')]
合并数据集
先把数据集拆分为多个,再进行合并
In[ ]:
df_usa=df[df.产地=='美国']
df_china=df[df.产地=='中国大陆']
df_china.append(df_usa)
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 热门程度 | 评分等级 |
23 | 执念师 | 0 | 0 | 0.0 | 0 | 科幻 | 0.0 | 中国大陆 | 2022/5/22 | NaN | NaN |
33 | 如来神掌 | 邹兆龙/巫迪文/唐菲/黄一飞 | 黄羿 | 0.0 | 0 | 科幻 | 0.0 | 中国大陆 | 0 | NaN | NaN |
44 | 悬棺 | 0 | 雷尼·哈林 | 0.0 | 0 | 动作/惊悚 | 0.0 | 中国大陆 | 0 | NaN | NaN |
59 | 龙族 | 0 | 0 | 0.0 | 0 | 动作/奇幻 | 0.0 | 中国大陆 | 0 | NaN | NaN |
62 | 赏金骇客 | 0 | 杨丹阳 | 0.0 | 0 | 动作/科幻 | 120.0 | 中国大陆 | 0 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
140315 | The F Word - 电影 | 0 | 0 | 0.0 | 0 | 喜剧/爱情 | 0.0 | 美国 | 0 | NaN | NaN |
140319 | Date with Death - 电影 | 0 | 0 | 0.0 | 0 | 犯罪 | 84.0 | 美国 | 0 | NaN | NaN |
140327 | The Paliser Case - 电影 | 波琳·弗雷德里克/艾伦·罗斯科 | 0 | 0.0 | 0 | 剧情/悬疑 | 50.0 | 美国 | 0 | NaN | NaN |
140349 | Fast Track - 电影 | 基思·卡拉丹/弗雷德·威廉森/邓肯·雷格尔/布兰迪·莱德福特/塞巴斯蒂安·斯宾赛/罗伯特·卡... | T·J·斯科特 | 0.0 | 0 | 剧情/动作 | 60.0 | 美国 | 0 | NaN | NaN |
140351 | 大鱼 - 电影 | 伊万·麦克格雷格/阿尔伯特·芬尼/比利·克鲁德普/杰西卡·兰格/海伦娜·伯翰·卡特/艾莉森·... | 蒂姆·波顿 | 0.0 | 346019 | 剧情/家庭/奇幻/冒险 | 125.0 | 美国 | 2003/12/4 | NaN | NaN |
50922 rows × 11 columns
将这两个数据集进行合并!
- merge()方法
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
)
作为一个功能完善、强大的语言,python的pandas库中的merge()支持各种内外连接。
- left与right:两个不同的DataFrame
- how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
- on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
- left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
- right_on:右则DataFrame中用作 连接键的列名
- left_index:使用左则DataFrame中的行索引做为连接键
- right_index:使用右则DataFrame中的行索引做为连接键
- sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
- suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
- copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
- indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
选6部热门电影
In[ ]:
df1=df.loc[:5]
df1
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 热门程度 | 评分等级 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 | E | B |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 | E | C |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 | NaN | D |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0.0 | 美国 | 2024/12/20 | A | B |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 | E | B |
5 | 未定名新星球大战三部曲第一部 | 0 | 莱恩·约翰逊 | 8.0 | 1663 | 科幻 | 0.0 | 美国 | 2022/12/16 | D | B |
In[ ]:
df2=df.loc[:5][['电影名称','产地']]
df2['票房']=[123456,123545,486213,45684,1213546,15484]
df2
| 电影名称 | 产地 | 票房 |
0 | 阿凡达5:追寻伊娃 | 美国 | 123456 |
1 | 未定名新星球大战三部曲第三部 | 美国 | 123545 |
2 | 阿凡达4:祖古骑士 | 美国 | 486213 |
3 | 未定名星球大战项目2 | 美国 | 45684 |
4 | 阿凡达3:带种者 | 美国 | 1213546 |
5 | 未定名新星球大战三部曲第一部 | 美国 | 15484 |
In[ ]:
df2=df2.sample(frac=1)
df2
| 电影名称 | 产地 | 票房 |
0 | 阿凡达5:追寻伊娃 | 美国 | 123456 |
4 | 阿凡达3:带种者 | 美国 | 1213546 |
5 | 未定名新星球大战三部曲第一部 | 美国 | 15484 |
3 | 未定名星球大战项目2 | 美国 | 45684 |
1 | 未定名新星球大战三部曲第三部 | 美国 | 123545 |
2 | 阿凡达4:祖古骑士 | 美国 | 486213 |
此时,索引对不上了...
现在,我们如何将df1和df2合并?
In[ ]:
pd.merge(df1,df2,how='inner',on='电影名称')
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地_x | 上映日期 | 热门程度 | 评分等级 | 产地_y | 票房 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 | E | B | 美国 | 123456 |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 | E | C | 美国 | 123545 |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 | NaN | D | 美国 | 486213 |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0.0 | 美国 | 2024/12/20 | A | B | 美国 | 45684 |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 | E | B | 美国 | 1213546 |
5 | 未定名新星球大战三部曲第一部 | 0 | 莱恩·约翰逊 | 8.0 | 1663 | 科幻 | 0.0 | 美国 | 2022/12/16 | D | B | 美国 | 15484 |
因为两个集都存在产地,故合并后有两个产地信息
- 3. concat()方法
可将多个数据集进行批量合并
In[ ]:
df1=df[:10]
df2=df[100:110]
df3=df[200:210]
dff=pd.concat([df1,df2,df3]) #axis默认为0,在行上进行修改,为1,在列上进行修改
dff
| 电影名称 | 主演 | 导演 | 豆瓣评分 | 豆瓣投票数 | 类型 | 片长 | 产地 | 上映日期 | 热门程度 | 评分等级 |
0 | 阿凡达5:追寻伊娃 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/凯特·温丝莱特/奥娜·卓别林/史蒂芬·朗/乔·大... | 詹姆斯·卡梅隆 | 9.0 | 1655 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2027/12/17 | E | B |
1 | 未定名新星球大战三部曲第三部 | 0 | 莱恩·约翰逊 | 6.0 | 306 | 动作/科幻 | 0.0 | 美国 | 2026/12/18 | E | C |
2 | 阿凡达4:祖古骑士 | 佐伊·索尔达娜/萨姆·沃辛顿/西格妮·韦弗/史蒂芬·朗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 5.0 | 22 | 动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2025/12/19 | NaN | D |
3 | 未定名星球大战项目2 | 0 | 0 | 8.0 | 1895 | 科幻 | 0.0 | 美国 | 2024/12/20 | A | B |
4 | 阿凡达3:带种者 | 佐伊·索尔达娜/萨姆·沃辛顿/史蒂芬·朗/西格妮·韦弗/凯特·温丝莱特/克利夫·柯蒂斯/奥娜... | 詹姆斯·卡梅隆 | 8.0 | 1660 | 剧情/动作/科幻/奇幻/冒险 | 0.0 | 美国 | 2023/12/22 | E | B |
5 | 未定名新星球大战三部曲第一部 | 0 | 莱恩·约翰逊 | 8.0 | 1663 | 科幻 | 0.0 | 美国 | 2022/12/16 | D | B |
6 | 黑豹2 | 查德维克·博斯曼 | 瑞恩·库格勒 | 8.0 | 1666 | 动作/奇幻/冒险 | 0.0 | 美国 | 2022/5/6 | D | B |
7 | 海王2 | 杰森·莫玛/艾梅柏·希尔德 | 温子仁 | 8.0 | 1669 | 动作/科幻 | 0.0 | 美国 | 2022/12/16 | D | B |
8 | 超级宠物 | 凯文·康瑞 | 贾里德·斯特恩/山姆·J·莱文 | 8.0 | 1672 | 动画 | 0.0 | 美国 | 2022/5/22 | D | B |
9 | 老虎的学徒 | 0 | 0 | 8.0 | 1675 | 动作/动画/冒险 | 0.0 | 美国 | 2022/2/11 | C | B |
100 | Sex Education | 0 | 米沙·曼森-史密斯 | 0.0 | 0 | 喜剧 | 0.0 | 英国 | 0 | NaN | NaN |
101 | 中国缉毒密战 | 0 | 翁子光 | 0.0 | 0 | 剧情/犯罪 | 0.0 | 中国大陆 / 中国香港 | 0 | NaN | NaN |
102 | 星际宝贝 | 0 | 0 | 0.0 | 0 | 喜剧/科幻/家庭/冒险 | 0.0 | 美国 | 0 | NaN | NaN |
103 | 破碎玻璃之光 | 派翠西娅·克拉克森/克里斯·库珀 | 伊莎贝尔·科赛特 | 0.0 | 0 | 剧情/歌舞 | 0.0 | 美国 | 0 | NaN | NaN |
104 | 乐器 | 安德鲁·加菲尔德 | 詹姆斯·马什 | 0.0 | 0 | 音乐/传记 | 0.0 | 美国 | 0 | NaN | NaN |
105 | 马尔科 | 迈克尔·法斯宾德 | 0 | 0.0 | 0 | 动作/惊悚 | 0.0 | 美国 | 0 | NaN | NaN |
106 | Untitled Hello Kitty Film | 0 | 0 | 0.0 | 0 | 剧情/动画 | 0.0 | 美国 | 0 | NaN | NaN |
107 | 犬王 | 0 | 汤浅政明 | 0.0 | 0 | 动画/历史 | 0.0 | 日本 | 0 | NaN | NaN |
108 | 撒旦真实存在 | 伊桑·霍克/亚历桑德罗·尼沃拉 | 菲尔·莫里森 | 0.0 | 0 | 剧情/传记 | 0.0 | 美国 | 0 | NaN | NaN |
109 | 小鱼 | 奥利维亚·库克/杰克·奥康奈尔 | 查德·哈蒂根 | 0.0 | 0 | 爱情/科幻 | 0.0 | 美国 | 0 | NaN | NaN |
200 | 冠军亚瑟 | 马克·沃尔伯格 | 0 | 0.0 | 0 | 动画 | 0.0 | 美国 | 0 | NaN | NaN |
201 | 刀锋剑客 | 塞缪尔·杰克逊/迈克尔·塞拉/梅尔·布鲁克斯/杰曼·翰苏/杨紫琼/加布里埃尔·伊格莱西亚斯/... | 克里斯·贝利 | 0.0 | 0 | 动画 | 0.0 | 美国 | 2021/6/10 | NaN | NaN |
202 | 355 | 杰西卡·查斯坦/佩内洛普·克鲁兹/黛安·克鲁格/露皮塔·尼永奥/塞巴斯蒂安·斯坦/埃德加·拉... | 西蒙·金伯格 | 0.0 | 0 | 动作/惊悚 | 0.0 | 美国 | 2021/1/15 | NaN | NaN |
203 | 拿破仑 | 0 | 鲁伯特·桑德斯 | 0.0 | 0 | 传记 | 0.0 | 美国 | 0 | NaN | NaN |
204 | 太空歌剧 | 0 | 0 | 0.0 | 0 | 科幻/歌舞 | 0.0 | 美国 | 0 | NaN | NaN |
205 | 自杀小队2 | 玛格特·罗比/伊德里斯·艾尔巴/乔尔·金纳曼/维奥拉·戴维斯/杰·科特尼/斯托姆·瑞德/约翰... | 詹姆斯·古恩 | 0.0 | 0 | 动作/科幻/悬疑/奇幻/冒险 | 0.0 | 美国 | 2021/8/6 | NaN | NaN |
206 | 云中阴影 | 科洛·莫瑞兹 | 罗丝安妮·梁 | 0.0 | 0 | 动作/恐怖 | 0.0 | 美国 | 0 | NaN | NaN |
207 | 角头3 | 0 | 0 | 0.0 | 0 | 剧情/动作/犯罪 | 0.0 | 中国台湾 | 0 | NaN | NaN |
208 | 新世界的孩子 | 0 | 王子逸 | 0.0 | 0 | 科幻 | 0.0 | 美国 | 0 | NaN | NaN |
209 | 言而有信的年轻女人 | 凯瑞·穆里根 | 埃默拉尔德·芬内尔 | 0.0 | 0 | 惊悚 | 0.0 | 英国 | 0 | NaN | NaN |
仅供参考学习,严禁转载!