【问题标题】:Melt a bunch of multiIndexed columns while keeping a single 'index' column在保留单个“索引”列的同时熔化一堆多索引列
【发布时间】:2020-02-10 14:42:57
【问题描述】:

我有一张大表,其中的行代表观察结果。我的列的一个子集可以按两个元类别分组,所以我使用多索引来表示这些。但是,多索引并不适用于所有列。所以剩下的所有列都只在第一级有索引标签。

我想将 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


    【解决方案1】:

    您可以使用空字符串作为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
    

    【讨论】:

      【解决方案2】:

      在我开始编写这个问题后,我偶然发现了一个解决方案。

      如果我在我的 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
      [...]
      

      【讨论】:

        猜你喜欢
        • 2020-01-05
        • 2020-03-11
        • 1970-01-01
        • 2020-02-18
        • 2013-11-05
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-30
        相关资源
        最近更新 更多