Skip to main content
 首页 » 编程设计

python之正确 reshape 该数据框的最佳方法

2025年05月04日20insus

我有以下数据框:

df =  
    c   f   V   E 
0   M   5  32  22 
1   M   7  45  40 
2   R   7  42  36 
3   R   9  41  38 
4   R   3  28  24 

我想要这样的结果,其中列 'f' 的值是我的新列,我的新索引是列 'c' 和数据框中其余列的组合(顺序行数无关紧要):

df_result =  
        3   5    7    9 
 V(M) NaN  32   45  NaN 
 E(M) NaN  22   40  NaN 
 V(R) 28  NaN   42   41 
 E(R) 24  NaN   36   38 

目前,我的代码是:

df_result = pd.concat([df.pivot('c','f',col).rename(index = {e: col + '(' + e + ')' for e in df.pivot('c','f',col).index}) for col in [e for e in df.columns if e not in ['c','f']]]) 

使用该代码我得到:

df_result =  
f      3   5   7   9 
c 
E(M)  NaN  22  40  NaN 
E(R)   24 NaN  36   38 
V(M)  NaN  32  45  NaN 
V(R)   28 NaN  42   41 

我认为这是一个有效的结果,但是,我不知道是否有办法准确地获得我想要的结果,或者至少有更好的方法来获得我已经得到的结果。

非常感谢您。

请您参考如下方法:

要获取表格,这是.melt + .pivot_table

df_result = df.melt(['f', 'c']).pivot_table(index=['variable', 'c'], columns='f') 

然后我们可以清理命名:

df_result = df_result.rename_axis([None, None], 1) 
df_result.columns = [y for _,y in df_result.columns] 
 
df_result.index = [f'{x}({y})' for x,y in df_result.index] 
# Python 2.:      ['{0}({1})'.format(*x) for x in df_result.index] 

输出:

         3     5     7     9 
E(M)   NaN  22.0  40.0   NaN 
E(R)  24.0   NaN  36.0  38.0 
V(M)   NaN  32.0  45.0   NaN 
V(R)  28.0   NaN  42.0  41.0 

您可能会考虑保留 MultiIndex 而不是展平为新字符串,因为它对于某些聚合来说可能更简单。