熊猫:折叠Multiindex数据框中的行

时间:2020-10-01 14:26:57

标签: python python-3.x pandas dataframe multi-index

下面是我的df:

df = pd.DataFrame({'A': [1, 1, 1, 2],
                         'B': [2, 2, 2, 3],
                         'C': [3, 3, 3, 4],
                         'D': ['Cancer A', 'Cancer B', 'Cancer A', 'Cancer B'],
                         'E': ['Ecog 9', 'Ecog 1', 'Ecog 0', 'Ecog 1'],
                         'F': ['val 6', 'val 1', 'val 0', 'val 1'],
                         'measure_m': [100, 200, 500, 300]})

print(df)

   A  B  C         D       E      F  measure_m
0  1  2  3  Cancer A  Ecog 9  val 6        100
1  1  2  3  Cancer B  Ecog 1  val 1        200
2  1  2  3  Cancer A  Ecog 0  val 0        500
3  2  3  4  Cancer B  Ecog 1  val 1        300

当我pivot这个df没有通过索引时,我得到了:

In [1280]: df.pivot(index=None, columns = ['A', 'B', 'C', 'D', 'E', 'F'])
Out[1280]: 
  measure_m                           
A         1                          2
B         2                          3
C         3                          4
D  Cancer A Cancer B Cancer A Cancer B
E    Ecog 9   Ecog 1   Ecog 0   Ecog 1
F     val 6    val 1    val 0    val 1
0     100.0      NaN      NaN      NaN
1       NaN    200.0      NaN      NaN
2       NaN      NaN    500.0      NaN
3       NaN      NaN      NaN    300.0

我想要的是4 rows而不是1单行,其中包含measure_m列的所有值,如下所示:

  measure_m                           
A         1                          2
B         2                          3
C         3                          4
D  Cancer A Cancer B Cancer A Cancer B
E    Ecog 9   Ecog 1   Ecog 0   Ecog 1
F     val 6    val 1    val 0    val 1
0     100.0    200.0    500.0    300.0

如何处理?

1 个答案:

答案 0 :(得分:4)

您的意思是:

df.set_index(list(df.columns[:-1])).T

输出:

A                1                          2
B                2                          3
C                3                          4
D         Cancer A Cancer B Cancer A Cancer B
E           Ecog 9   Ecog 1   Ecog 0   Ecog 1
F            val 6    val 1    val 0    val 1
measure_m      100      200      500      300

更新,进行一些修改以匹配您的输出:

cols = ['A', 'B', 'C', 'D', 'E', 'F']

(df.set_index(cols)
   [['measure_m']] # only need this if you have more columns
   .unstack(level=cols)
   .to_frame().T
)

输出:

  measure_m                           
A         1                          2
B         2                          3
C         3                          4
D  Cancer A Cancer B Cancer A Cancer B
E    Ecog 9   Ecog 1   Ecog 0   Ecog 1
F     val 6    val 1    val 0    val 1
0       100      200      500      300