【问题标题】:Adding the lower levels of two Pandas MultiIndex columns添加两个 Pandas MultiIndex 列的较低级别
【发布时间】:2019-07-03 21:14:48
【问题描述】:

我有以下数据框:

import pandas as pd

columns = pd.MultiIndex.from_arrays([['n1', 'n1', 'n2', 'n2'],
                                     ['p',  'm',  'p',  'm']])
values = [
    [1, 2,  3,  4],
    [5, 6,  7,  8],
    [9, 10, 11, 12],
]
df = pd.DataFrame(values, columns=columns)
  n1      n2    
   p   m   p   m
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

现在我想在这个 DataFrame 中添加另一列 (n3),其下层列 pm 应该是对应的下层列 n1n2 的总和:

  n1      n2      n3    
   p   m   p   m   p   m
0  1   2   3   4   4   6
1  5   6   7   8  12  14
2  9  10  11  12  20  22

这是我想出的代码:

n3 = df[['n1', 'n2']].sum(axis=1, level=1)
level1 = df.columns.levels[1]
n3.columns = pd.MultiIndex.from_arrays([['n3'] * len(level1), level1])
df = pd.concat([df, n3], axis=1)

这是我想要的,但与不使用 MultiIndex 列的代码相比感觉非常麻烦:

df['n3'] = df[['n1', 'n2']].sum(axis=1)

我当前的代码也只适用于包含两个级别的列 MultiIndex,我有兴趣对任意级别执行此操作。

有什么更好的方法?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    使用stackunstack 的一种方法:

    new_df = df.stack(level=1)
    new_df['n3'] = new_df.sum(axis=1)
    new_df.unstack(level=-1)
    

    输出:

       n1     n2      n3    
        m  p   m   p   m   p
    0   2  1   4   3   6   4
    1   6  5   8   7  14  12
    2  10  9  12  11  22  20
    

    【讨论】:

    • 这行得通,但 stack / unstack 组合会重新排序列。
    【解决方案2】:

    如果你构建这样的结构:

    df['n3','p']=1  
    df['n3','m']=1
    

    那么你可以写:

    df['n3'] = df[['n1', 'n2']].sum(axis=1, level=1)
    

    【讨论】:

    • 这行得通,但对列结构进行了硬编码,因此不能按原样与其他列名一起使用。
    【解决方案3】:

    这是我刚刚发现的另一种不重新排序列的方式:

    # Sum column-wise on level 1
    s = df.loc[:, ['n1', 'n2']].sum(axis=1, level=1)
    
    # Prepend a column level
    s = pd.concat([s], keys=['n3'], axis=1)
    
    # Add column to DataFrame
    df = pd.concat([df, s], axis=1)
    

    【讨论】:

      猜你喜欢
      • 2013-01-22
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2018-12-20
      • 2020-02-14
      • 2017-06-18
      • 2017-04-19
      相关资源
      最近更新 更多