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是一种类似与一维数组的对象,由下面两部分组成
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
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]])
这里以电影评分为例:(随机摘取):
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 |
缺失值处理方法
判断缺失值
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() 参数:
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') #文件,将保存在当前文件夹
在做数据分析的时候,原始数据往往会因为各种各样的原因产生各种数据格式的问题。
数据格式是我们非常注意的一点,数据格式错误往往会造成严重的后果。并且,很多异常值也是我们经过格式转换之后才会发现,对我们规整数据、清洗数据有着重要的作用。
读取数据
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') #转换为整数格式
默认排序
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 |
(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
(3)均值和中值
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
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 |
同样,可以按照多个索引进行汇总。
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()
GroupBy技术:实现数据的分组,分组运算,作用类似于数据透视表
按照电影的产地进行分组
先定义一个分组变量group
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
在实际数据分析中,对某些数据我们往往并不关心数据的绝对取值,而只关心它所处的区间或等级。
比如可以把评分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')]
合并数据集
1. append()方法
先把数据集拆分为多个,再进行合并
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(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()支持各种内外连接。
选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 |
因为两个集都存在产地,故合并后有两个产地信息
可将多个数据集进行批量合并
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 |
仅供参考学习,严禁转载!