如何在 pandas 中为 columns 参数进行多列转换
how to dcast in pandas with more than one columns for columns argument
我有以下dataframe
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
。 multi-index
让我很困惑
有什么想法吗?
更新
我想以
结尾
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
- 通过 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
df2 = (df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'],
values='value')
.reset_index()
)
输出:
id id_2 A B
X Z X 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
我有以下dataframe
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
。 multi-index
让我很困惑
有什么想法吗?
更新
我想以
结尾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
- 通过 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
df2 = (df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'],
values='value')
.reset_index()
)
输出:
id id_2 A B
X Z X 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