使用MultiIndex列在不同级别上求和还是groupby?

时间:2018-09-05 06:15:08

标签: pandas

我有一个数据框,为了避免元组列名,我故意使用空白级别:

>>> df
      user1 user2 count
                   0      1             2
                   a      a      b      a 
    0  2     6     0      1      0      0
    1  4     6     0      0      0      3
    2  21    76    2      0      1      0
    3  5     18    0      0      0      0

请注意,user1user2count处于同一级别(合并的副作用)。

我想创建一个新列(也许在count下?),该列取所有12的总和( 0不包括在内!)。那将意味着:

>>> df
      user1 user2 count
                   0      1             2       sum_1_2
                   a      a      b      a       a        b
    0  2     6     0      1      0      0       1+0      0
    1  4     6     0      0      0      3       0        0+3
    2  21    76    2      0      1      0       0        0
    3  5     18    0      0      0      0       0        0

我已经基于this thread尝试了df.groupby(level=[0,2]).sum(),但是它们没有给我想要的结果(它们的总和中还包含0列,它们也总和{ {1}}和user1)。

发电机代码:

user2

1 个答案:

答案 0 :(得分:1)

首先使用slicers仅过滤1,2,然后使用sum并添加与原始DataFrame相同级别的级别,以可能使用concat

idx = pd.IndexSlice
df3 = final_df.loc[:, idx[:, [1,2],:]].sum(level=2, axis=1)
df3.columns = pd.MultiIndex.from_product([['count'], ['sum_1_2'], df3.columns])
print (df3)
    count     
  sum_1_2     
        a    b
0     1.0  0.0
1     0.0  0.0
2     0.0  1.0
3     3.0  0.0

df = pd.concat([final_df, df3], axis=1)
print (df)
  user1 user2 count                            
                  0    1         2 sum_1_2     
                  a    a    b    a       a    b
0     2     6   0.0  1.0  0.0  0.0     1.0  0.0
1     5    18   0.0  0.0  0.0  0.0     0.0  0.0
2    21    76   2.0  0.0  1.0  0.0     0.0  1.0
3     4     6   0.0  0.0  0.0  3.0     3.0  0.0

详细信息

print (final_df.loc[:, idx[:, [1,2],:]])
  count          
      1         2
      a    b    a
0   1.0  0.0  0.0
1   0.0  0.0  0.0
2   0.0  1.0  0.0
3   0.0  0.0  3.0