Pandas在多索引列上融化

ehxuflar  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(189)

我有一个Pandas的数据框,看起来像这样:

df = pd.DataFrame({('AA', 'A'): {0: 'a', 1: 'b', 2: 'c'},
               ('AA', 'B'): {0: 'd', 1: 'e', 2: 'f'},
               ('AA', 'C'): {0: 'g', 1: 'h', 2: 'i'},
               ('BB', 'D'): {0: 1, 1: 2, 2: 3},
               ('BB', 'E'): {0: 4, 1: 5, 2: 6}})

  AA       BB   
   A  B  C  D  E
0  a  d  g  1  4
1  b  e  h  2  5
2  c  f  i  3  6

我想取消透视'BB'中的所有列,并将'AA'中的所有列保留为标识符。因此,我应该以如下形式结束:

` AA             BB      
   A  B  C Variable Value
0  a  d  g        D     1
1  b  e  h        D     2
2  c  f  i        D     3
3  a  d  g        E     4
4  b  e  h        E     5
5  c  f  i        E     6`

下面的代码不起作用

df.melt(id_vars=['AA'], value_vars=['BB'], col_level=0) `

这样的工作,但并不觉得很冗长。我还结束了一个额外的列和多索引是平坦的:

df.melt(id_vars=[('AA','A'),('AA','B'), ('AA','C')], value_vars=[('BB','D'),('BB','E')])

`  (AA, A) (AA, B) (AA, C) variable_0 variable_1  value
0       a       d       g         BB          D      1
1       b       e       h         BB          D      2
2       c       f       i         BB          D      3
3       a       d       g         BB          E      4
4       b       e       h         BB          E      5
5       c       f       i         BB          E      6`
dgiusagp

dgiusagp1#

您可以使用以下命令实现类似于上一个命令的效果:

out = (df.melt(df[['AA']].columns.tolist())
         .drop(columns='variable_0')
         .rename(columns={'variable_1': 'variable'})
      )

输出:

(AA, A) (AA, B) (AA, C) variable  value
0       a       d       g        D      1
1       b       e       h        D      2
2       c       f       i        D      3
3       a       d       g        E      4
4       b       e       h        E      5
5       c       f       i        E      6

要还原多索引:

out.columns = pd.MultiIndex.from_tuples([x if isinstance(x, tuple) else ['BB', x]
                                         for x in out.columns])

输出:

AA              B      
   A  B  C variable value
0  a  d  g        D     1
1  b  e  h        D     2
2  c  f  i        D     3
3  a  d  g        E     4
4  b  e  h        E     5
5  c  f  i        E     6

相关问题