在单个列或MultiIndex级别上聚合(sum)数据帧



我有一个具有许多描述性列和一对值列的DataFrame,例如以下val1val2是值,其他所有内容都描述了这些值:

In [58]: countries = ['X', 'Y', 'Z']; sectors = ['A', 'B', 'C']
In [59]: ch = np.random.choice
In [61]: df = pd.DataFrame(dict(c=ch(countries, 100), s1=ch(sectors, 100), s2=ch(sectors, 100), is_good=ch([True, False], 100), val1=np.random.random(100), val2=np.random.random(100)))
In [62]: df.head()
Out[62]: 
   c is_good s1 s2      val1      val2
0  Z    True  B  B  0.694949  0.145197
1  X    True  A  A  0.319551  0.548003
2  X   False  A  C  0.946967  0.220035
3  X   False  B  A  0.998087  0.902530
4  Y   False  B  C  0.303517  0.660556

假设我对一个值是否"好"不感兴趣,所以我想对is_good上的值列求和。

通常我会这样做:

In [63]: df.set_index(['c', 's1', 's2', 'is_good']).sum(level=['c', 's1', 's2'])
Out[63]: 
             val1      val2
c s1 s2                    
X A  A   2.170132  1.999072
     B   2.038995  3.528096
     C   4.041300  3.150400
  B  A   2.418448  2.011886
     B   1.212810  1.489008
     C   0.284823  0.961956

,但是当有很多描述性列时,这会变得有点笨拙和容易出错。(这里还可以,但如果还有更多的话,就已经很困难了。)

我真的在寻找一个指定is_good列的操作,而不是指定所有该列。

你可以这样设置:

val_cols = ['val1', 'val2']
descriptive_cols = df.columns.difference(val_cols)
group_cols = descriptive_cols.difference(['is_good'])
df.groupby(group_cols)[val_cols].sum()

一旦你做出了初始定义,你就可以用任何其他你不感兴趣的列或列的子集替换'is_good',所以你只需要做一次。

最新更新