根据条件在行之间的熊猫中分组

时间:2019-07-26 13:32:45

标签: python pandas pandas-groupby

让我们说,我有以下数据框:

   name  number
0     A     100
1     B     200
2     B      30
3     A      20
4     B      30
5     A      40
6     A      50
7     A     100
8     B      10
9     B      20
10    B      30
11    A      40

我想做的是在name == 'B'的两行之间合并name == 'A'的所有连续行,并得到相应的总和。因此,我希望最终输出看起来像这样:

    name  number
0    A     100
1    B     230
2    A      20
3    B      30
4    A      40
5    A      50
6    A     100
7    B      60
8    A      40

2 个答案:

答案 0 :(得分:6)

我们可以在此处使用一些groupby技巧。用A创建一个遮罩,然后将B的每个后续组移动到它们自己的组中。该答案假设您的name系列包含 just A和B。


c = df['name'].eq('A')
m1 = c.cumsum()

m = m1.where(c, m1 + m1.max())

df.groupby(m, sort=False, as_index=False).agg({'name': 'first', 'number': 'sum'})

  name  number  
0    A     100  
1    B     230  
2    A      20  
3    B      30  
4    A      40  
5    A      50  
6    A     100  
7    B      60  
8    A      40  

答案 1 :(得分:1)

比较笨拙的尝试-但自从我做完之后,不妨发布。

这只是一段时间的基本for循环:

for i in df.index:
    if i in df.index and df.loc[i, 'name'] == 'B':
        while df.loc[i+1, 'name'] == 'B':
            df.loc[i, 'number'] += df.loc[i+1, 'number']
            df = df.drop(i+1).reset_index(drop=True)

这非常简单(因此我认为效率很低):如果B,如果下一行也是B,则将下一行添加到该行的编号中,然后删除下一行。