我有以下数据框
import pandas as pd
df = pd.DataFrame({'id':[1,2,3,4,5,6], 'id_2':[6,5,4,3,2,1],
'col_1':['A','A','A','B','B','B'],
'col_2':['X','Z','X','Z','X','Z'],
'value':[10,20,30,40,50,60]})
我想dcast
它,所以我使用
df= df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'],aggfunc=lambda x: x)
我不知道如何将 droplevel
和 df.columns
更改为 A_X,A_Z,B_X,B_Z
。 多索引
让我很困惑
有什么想法吗?
更新
我想结束
import numpy as np
df=pd.DataFrame({'id':[1,2,3,4,5,6], 'id_2':[6,5,4,3,2,1],
'A_X':[10,np.nan,30,np.nan,np.nan,np.nan],
'A_Z':[np.nan,20,np.nan,np.nan,np.nan,np.nan],
'B_X':[np.nan,np.nan,np.nan,np.nan,50,np.nan],
'B_Z':[np.nan,np.nan,np.nan,40,np.nan,60]})
最佳答案
您需要从 Multiindex
中删除顶级 value
- by Index.droplevel
或列表理解:
print (df.columns)
MultiIndex(levels=[['value'], ['A', 'B'], ['X', 'Z']],
codes=[[0, 0, 0, 0], [0, 0, 1, 1], [0, 1, 0, 1]],
names=[None, 'col_1', 'col_2'])
df.columns = df.columns.droplevel(0).map('_'.join)
或者:
df.columns = [f'{b}_{c}' for a,b,c in df.columns]
df = df.reset_index()
print (df)
id id_2 A_X A_Z B_X B_Z
0 1 6 10.0 NaN NaN NaN
1 2 5 NaN 20.0 NaN NaN
2 3 4 30.0 NaN NaN NaN
3 4 3 NaN NaN NaN 40.0
4 5 2 NaN NaN 50.0 NaN
5 6 1 NaN NaN NaN 60.0
另一种解决方案是在 pivot_table
中指定 value
参数:
df= df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'], values='value')
print (df.columns)
MultiIndex(levels=[['A', 'B'], ['X', 'Z']],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['col_1', 'col_2'])
df.columns = df.columns.map('_'.join)
df = df.reset_index()
print (df)
id id_2 A_X A_Z B_X B_Z
0 1 6 10.0 NaN NaN NaN
1 2 5 NaN 20.0 NaN NaN
2 3 4 30.0 NaN NaN NaN
3 4 3 NaN NaN NaN 40.0
4 5 2 NaN NaN 50.0 NaN
5 6 1 NaN NaN NaN 60.0
关于python - 如何在 pandas 中为 columns 参数进行多列转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55589125/