Skip to main content
 首页 » 编程设计

python之如何在 pandas 中为 columns 参数进行多列转换

2025年05月04日20hnrainll

我有以下数据框

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