【问题标题】:Pandas: Collapse rows in a Multiindex dataframePandas:折叠多索引数据框中的行
【发布时间】:2021-01-17 07:09:48
【问题描述】:

下面是我的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

如何解决这个问题?

【问题讨论】:

  • 这种格式的目的是什么?你需要它来做模型还是演示?只是好奇
  • 是的,我需要将其发送到 UI。

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


【解决方案1】:

你的意思是:

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

【讨论】:

  • 这里唯一的一点是,T 在处理巨大的数据帧时有点昂贵。还有什么可以做的吗?
  • T 并不昂贵,除了复制您的数据。例如,它比pivotunstack 甚至set_index 的成本要低得多。如果您真的不需要水平格式,可以删除 T。除此之外,我不确定是否有更好的方法。
  • 好吧,这是有道理的。谢谢。
  • 您的第二个解决方案失败,错误:ValueError: Length mismatch: Expected axis has 4 elements, new values have 2 elements.
  • 不知道为什么,它目前适用于示例数据和cols = ['A', 'B', 'C', 'D', 'E', 'F']
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2016-02-24
  • 2012-07-20
  • 2021-11-20
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2021-06-24
相关资源
最近更新 更多