让我们说,我有以下数据框:
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
答案 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,则将下一行添加到该行的编号中,然后删除下一行。