movie_data2.xlsx

酒店数据1.xlsx

导入包

import pandas as pd
import numpy as np

读入数据

df = pd.read_excel(r'C:\\Users\\Lovetianyi\\Desktop\\python\\作业4\\movie_data2.xlsx', index_col = 0)
df[:5]
名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 肖申克的救赎 692795 剧情/犯罪 美国 1994年9月10日 00:00 142 1994 9.6 多伦多电影节
1 控方证人 42995 剧情/悬疑/犯罪 美国 1957年12月17日 00:00 116 1957 9.5 美国
2 美丽人生 327855 剧情/喜剧/爱情 意大利 1997年12月20日 00:00 116 1997 9.5 意大利
3 阿甘正传 580897 剧情/爱情 美国 1994年6月23日 00:00 142 1994 9.4 洛杉矶首映
4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993年1月1日 00:00 171 1993 9.4 香港

3.1 数据重塑和轴向旋转

(1)层次化索引

层次化索引是pandas的一项重要功能,它能使我们在一个轴上拥有多个索引。

Series的层次化索引:

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 #类似于合并单元格

Out[4]:

a  1    1
   2    2
   3    3
b  1    4
   2    5
c  3    6
   1    7
d  2    8
   3    9
dtype: int32

In [5]:index

s.index

Out[5]:

MultiIndex([('a', 1),
            ('a', 2),
            ('a', 3),
            ('b', 1),
            ('b', 2),
            ('c', 3),
            ('c', 1),
            ('d', 2),
            ('d', 3)],
           )

In [6]: 外层索引

s['a'] #外层索引

Out[6]:

1    1
2    2
3    3
dtype: int32

In [7]: 切片

s['a':'c'] #切片

Out[7]:

a  1    1
   2    2
   3    3
b  1    4
   2    5
c  3    6
   1    7
dtype: int32

In [8]: 内层索引

s[:,1] #内层索引

Out[8]:

a    1
b    4
c    7
dtype: int32

In [9]: 提取具体的值

s['c',3] #提取具体的值

Out[9]:

6

通过unstack方法可以将Series变成一个DataFrame

Untitled

s.unstack()
1 2 3
a 1.0 2.0 3.0
b 4.0 5.0 NaN
c 7.0 NaN 6.0
d NaN 8.0 9.0

In [11]:形式上的相互转换

s.unstack().stack() #形式上的相互转换
a  1    1.0
   2    2.0
   3    3.0
b  1    4.0
   2    5.0
c  1    7.0
   3    6.0
d  2    8.0
   3    9.0
dtype: float64

Dataframe的层次化索引:

对于DataFrame来说,行和列都能进行层次化索引。

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

Untitled

data['A']

Untitled

data.index.names = ["row1","row2"]
data.columns.names = ["col1", "col2"]
data

Untitled

In [15]: 位置调整

data.swaplevel("row1","row2") #位置调整

Out[15]:

Untitled

了解了层次化索引的基本知识之后,我们试着将电影数据也处理成一种多层索引的结构**。**

In [16]: 默认索引

df.index #默认索引

Out[16]:

Int64Index([    0,     1,     2,     3,     4,     5,     6,     7,     8,
                9,
            ...
            38153, 38154, 38155, 38156, 38157, 38158, 38159, 38160, 38161,
            38162],
           dtype='int64', length=38163)

把产地和年代同时设成索引,产地是外层索引,年代为内层索引。

set_index可以把列变成索引 reset_index是把索引变成列

In [17]:

df = df.set_index(["产地", "年代"])
df

Untitled

每一个索引都是一个元组

df.index[0]
('美国', 1994)

获取所有的美国电影,由于产地信息已经变成了索引,因此要是用.loc方法。

In [19]: 行标签索引行数据,注意索引多行时两边都是闭区间

df.loc["美国"] #行标签索引行数据,注意索引多行时两边都是闭区间

Out[19]:

Untitled

In [20]:

df.loc["中国大陆"]

Untitled

这样做的最大好处是我们可以简化很多的筛选环节

df = df.swaplevel("产地", "年代") #调换标签顺序
df