导入包
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 | 香港 |
层次化索引是pandas的一项重要功能,它能使我们在一个轴上拥有多个索引。
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
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来说,行和列都能进行层次化索引。
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
data['A']
data.index.names = ["row1","row2"]
data.columns.names = ["col1", "col2"]
data
In [15]: 位置调整
data.swaplevel("row1","row2") #位置调整
Out[15]:
了解了层次化索引的基本知识之后,我们试着将电影数据也处理成一种多层索引的结构**。**
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
每一个索引都是一个元组
df.index[0]
('美国', 1994)
获取所有的美国电影,由于产地信息已经变成了索引,因此要是用.loc方法。
In [19]: 行标签索引行数据,注意索引多行时两边都是闭区间
df.loc["美国"] #行标签索引行数据,注意索引多行时两边都是闭区间
Out[19]:
In [20]:
df.loc["中国大陆"]
这样做的最大好处是我们可以简化很多的筛选环节
df = df.swaplevel("产地", "年代") #调换标签顺序
df