熊猫groupby定制组

时间:2020-01-22 17:01:01

标签: python pandas aggregate pandas-groupby

假设我有一个这样的数据框:

df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6], 'B': ['a', 'a', 'b', 'b', 'c', 'c']})
print(df)

   A  B
0  1  a
1  2  a
2  3  b
3  4  b
4  5  c
5  6  c

如何按B列进行分组,使分组分别为aa OR ba OR b OR c,而不仅仅是a,{{1} }和b?出于示例的原因,假设我想按c汇总结果。然后我会得到:

'sum'

1 个答案:

答案 0 :(得分:3)

我认为这实际上取决于您要使用的功能。 例如,如果您想计算 sum ,我可以想到一个DataFrame.expanding的技巧。我们的想法是我们可以利用扩展,然后只考虑整个行Series.where

已选择组
df.expanding().sum().where(df['B'].ne(df['B'].shift(-1)))
      A
0   NaN
1   3.0
2   NaN
3  10.0
4   NaN
5  21.0

df.expanding().sum().where(df['B'].ne(df['B'].shift(-1))).loc[lambda x: x.A.notna()]

      A
1   3.0
3  10.0
5  21.0

已更新

我们还可以使用DataFrame.groupby + DataFrame.expanding

df.groupby('B').sum().expanding().sum()

要获得预期的输出:

new_df = (df.groupby('B').sum().expanding().sum()
            .reset_index()
            .assign(B = lambda x: x.B.add(' or ').cumsum()
                                  .str.rstrip(' or '))
            .set_index('B') )
print(new_df)
                A
B                
a             3.0
a or b       10.0
a or b or c  21.0