重塑层次化索引stack()
DataFrame.stack(level=-1, dropna=True)
上面参数含义如下:
level:表示操作内层索引,若设为0表示操作外层索引。
dropna:表示是否将旋转后的缺失值删除,若设为True,则表示自动过滤缺失值,如果为False则相反。
df = pd.DataFrame({'A':['A0','A1','A2'],
'B':['B0','B1','B2']})
print(df)
print(df.stack(level=-1,dropna=True)) # 尝试内层索引
print(df.stack(level=0,dropna=True)) # 尝试外层索引
print(type(df.stack()))
res = df.stack()
print(res)
res.unstack() # 将数据转换回去
-------------------------------------下面是输出结果---------------------------------------
A B
0 A0 B0
1 A1 B1
2 A2 B2
------------------------------------
0 A A0
B B0
1 A A1
B B1
2 A A2
B B2
dtype: object
------------------------------------
0 A A0
B B0
1 A A1
B B1
2 A A2
B B2
dtype: object
------------------------------------
<class 'pandas.core.series.Series'>
------------------------------------
0 A A0
B B0
1 A A1
B B1
2 A A2
B B2
dtype: object
------------------------------------
A B
0 A0 B0
1 A1 B1
2 A2 B2
下面是多层索引设的重塑
重塑内层索引图
重塑外层索引图
下面是代码
df = pd.DataFrame(np.array([[26,20,22,26],[30,25,24,20]]), # 这里也可以不写np.array(),直接一个二维数组
index = ['男生人数','女生人数'],
columns = [['一楼','一楼','二楼','二楼'],
['A教室','B教室','A教室','B教室']])
print(df)
print(df.stack(level=-1))
df.stack(level=0)
----------------------------------下面是输出结果-----------------------------------
一楼 二楼
A教室 B教室 A教室 B教室
男生人数 26 20 22 26
女生人数 30 25 24 20
-----------------------------------------
一楼 二楼
男生人数 A教室 26 22
B教室 20 26
女生人数 A教室 30 24
B教室 25 20
-----------------------------------------
A教室 B教室
男生人数 一楼 26 20
二楼 22 26
女生人数 一楼 30 25
二楼 24 20
轴向旋转pivot()
在pandas中,pivot()提供了这样的功能,它会根据给定的行索引或列索引重新组织一个DataFrame对象
DataFrame.pivot(index=None, columns=None, values=None)
index:用于创建新DataFrame对象的行索引,如果未设置,则使用原DataFrame对象的索引
columns:用于创建新DataFrame对象的列索引,如果未设置,则使用原DataFrame对象的索引
value:用于填充新DataFrame对象的中的值
下面是轴转向代码
df = pd.DataFrame({'商品名称':['荣耀9青春版','小米6x','OPPO A1','荣耀9青春版','小米6x','OPPO A1'],
'出售日期':['2017年5月25日','2017年5月25日','2017年5月25日','2017年6月8日','2017年6月8日','2017年6月8日'],
'价格':['999元','1399元','1399元','800元','1200元','1250元']})
print(df)
df.pivot(index='出售日期',columns='商品名称',values='价格')
--------------------------------下面是输出结果-----------------------------------
商品名称 出售日期 价格
0 荣耀9青春版 2017年5月25日 999元
1 小米6x 2017年5月25日 1399元
2 OPPO A1 2017年5月25日 1399元
3 荣耀9青春版 2017年6月8日 800元
4 小米6x 2017年6月8日 1200元
5 OPPO A1 2017年6月8日 1250元
---------------------------------------------------
商品名称 OPPO A1 小米6x 荣耀9青春版
出售日期
2017年5月25日 1399元 1399元 999元
2017年6月8日 1250元 1200元 800元