首页 > 解决方案 > 用多个列组重塑 Pandas 数据框

问题描述

我目前有一个宽数据框,如下所示:

Index ID1 ID2 Foc_A Foc_B Foc_C Sat_A Sat_B Sat_C
   0   r  1   10    15    17    100   105   107
   1   r  2   20    25    27    110   115   117
   2   s  1   30    35    37    120   125   127
   3   s  2   40    45    47    130   135   137

每个条目都有多个标识符列(ID1 和 ID2)。然后,我有两个单独的测量类别(Foc 和 Sat),每个类别都包含多个标识符(A、B、C)(类别标识符在类别之间共享)。我最终需要将它绘制在 facet_grid 中,其中 x 和 y 作为每个测量类别并由类别标识符分隔,所以我试图重塑它,使其看起来像这样:

Index ID1 ID2 Ch  Foc  Sat 
   0   r  1   A   10   100 
   1   r  1   B   15    105
   2   r  1   C   17    107
   3   r  2   A   20    110 
   4   r  2   B   25    115 
   5   r  2   C   27    117 
   6   s  1   A   30    120 
   7   s  1   B   35    125
   8   s  1   C   37    127

我一直在尝试 .melt、.pivot 和 .stack,但不了解我做得很好以取得进展。

标签: pythonpandas

解决方案


你正在以正确的方式思考。你可以做:

# melt the dataframe
d1 = df.set_index(['Index', 'ID1', 'ID2']).stack().reset_index()

# create separate column
d1[['flag', 'Ch']] = d1['level_3'].str.split('_', expand=True)
d1 = d1.drop('level_3', 1)
d1 = d1.rename(columns = {0: 'Foc'})

# expand the dataframe to wide
d2 = pd.pivot_table(d1, index=['Index', 'ID1', 'ID2', 'Ch'], columns=['flag']).reset_index()

# fix column names
d2.columns = ['Index', 'ID1', 'ID2', 'Ch', 'Foc', 'Sat']

print(d2.head())

   Index ID1  ID2 Ch  Foc  Sat
0      0   r    1  A   10  100
1      0   r    1  B   15  105
2      0   r    1  C   17  107
3      1   r    2  A   20  110
4      1   r    2  B   25  115

推荐阅读