融合一堆multiIndexed列,同时保留一个'index'列

问题描述 投票:0回答:2

我有一张大桌子,上面的行代表观察值。我的列的子集可以按两个元类别进行分组,因此我已使用multiindex表示了它们。但是,multiindex不适用于所有列。因此,其余所有列仅在第一级具有索引标签。

我想将melt()应用到其中的某些多维列,然后再通过索引列将它们合并()并与我的主表一起返回。

这里是我卡住的零件的MRE。我有一个这样的数据框:

df = pd.DataFrame({
  ('INDEX',): [1,2,3],
  ('a','x'): ['ww','rt','pb'],
  ('a','y'): [88,97,12],
  ('b','x'): ['ew','tr','cv'],
  ('b','y'): [14,42,67],
  ('c','x'): ['wq','fg','dg'],
  ('c','y'): [65,78,46]})

df
  INDEX   a       b       c
    NaN   x   y   x   y   x   y
0     1  ww  88  ew  14  wq  65
1     2  rt  97  tr  42  fg  78
2     3  pb  12  cv  67  dg  46

现在我想要这个:

df.melt(id_vars=('INDEX',))

...导致此:

INDEX thing_1 thing_2 value
    1       a       x    ww
    2       a       x    rt
    3       a       x    pb
    1       a       y    88
    2       a       y    97
    3       a       y    12
    1       b       x    ew
    2       b       x    tr
    3       b       x    cv
    1       b       y    14
    2       b       y    42
    3       b       y    67
    1       c       x    wq
    2       c       x    fg
    3       c       x    dg
    1       c       y    65
    2       c       y    78
    3       c       y    46

但是我得到了以Exception: Data must be 1-dimensional结尾的长回溯。

[当我第一次尝试进行此操作时,我试图提供value_vars,但没有运气;后来我意识到del df['INDEX']; df.melt()毫无问题,除了我想保留INDEX列。

[我还尝试了一些变体,例如将'INDEX'放入1元组,以np.nanslice(None)结尾的2元组,列表等。对于一维数据,我也有同样的抱怨,或在某些情况下为ValueError: id_vars must be a list of tuples when columns are a MultiIndex

解决此问题的正确方法是什么?经过一堆反复试验后,我找到了一个解决方案,我将在下面发布,但看来它应该更简单或更优雅。谢谢。

python pandas multi-index melt
2个回答
0
投票

[我开始提出这个问题后,偶然发现了一个解决方案。

如果在我的DataFrame分配中将('INDEX',)替换为('INDEX','foo'),那么我会得到这样的解决方案:

df.melt(id_vars=[('INDEX','foo')])

    (INDEX, foo) variable_0 variable_1 value
0              1          a          x    ww
1              2          a          x    rt
2              3          a          x    pb
3              1          a          y    88
4              2          a          y    97
[...]

0
投票

您可以使用空字符串作为INDEX的第二级

df = pd.DataFrame({
  ('INDEX',''): [1,2,3],
  ('a','x'): ['ww','rt','pb'],
  ('a','y'): [88,97,12],
  ('b','x'): ['ew','tr','cv'],
  ('b','y'): [14,42,67],
  ('c','x'): ['wq','fg','dg'],
  ('c','y'): [65,78,46]})

In [198]: df
Out[198]:
  INDEX   a       b       c
          x   y   x   y   x   y
0     1  ww  88  ew  14  wq  65
1     2  rt  97  tr  42  fg  78
2     3  pb  12  cv  67  dg  46

df.melt(id_vars='INDEX')

Out[200]:
    INDEX variable_0 variable_1 value
0       1          a          x    ww
1       2          a          x    rt
2       3          a          x    pb
3       1          a          y    88
4       2          a          y    97
5       3          a          y    12
6       1          b          x    ew
7       2          b          x    tr
8       3          b          x    cv
9       1          b          y    14
10      2          b          y    42
11      3          b          y    67
12      1          c          x    wq
13      2          c          x    fg
14      3          c          x    dg
15      1          c          y    65
16      2          c          y    78
17      3          c          y    46
© www.soinside.com 2019 - 2024. All rights reserved.