Python数据分析及可视化实例之“Pandas“

第一篇

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

切片操作:隐式索引切片和显式索引切片
  显式索引切片:indexloc
  隐式索引切片:整数索引值和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 缺失值及异常值处理

 

缺失值处理方法

Python数据分析及可视化实例之“Pandas“_第1张图片

 

判断缺失值

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') #转换为字符串格式

格式转换

将年份转化为整数格式

   报错

Python数据分析及可视化实例之“Pandas“_第2张图片

 

将时长转化为整数格式

In[ ]:
df['片长']=df['片长'].astype('int')  #转换为整数格式

Python数据分析及可视化实例之“Pandas“_第3张图片

 

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

 

(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)  #注意,对应匹配

 

计算每一年的电影数量

 

Python数据分析及可视化实例之“Pandas“_第4张图片

比如,对上映时间的统计,也是一样:

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

Python数据分析及可视化实例之“Pandas“_第5张图片

 

通过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技术:实现数据的分组,分组运算,作用类似于数据透视表

按照电影的产地进行分组

先定义一个分组变量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

 

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')]

 

合并数据集

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

将这两个数据集进行合并!

  1. 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)

作为一个功能完善、强大的语言,pythonpandas库中的merge()支持各种内外连接。

  • leftright:两个不同的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

因为两个集都存在产地,故合并后有两个产地信息

 

  1. 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

 

仅供参考学习,严禁转载!

你可能感兴趣的:(开发应用-Python)