python分组符合条件相加_python-根据条件分组和子集行

我想过滤我的数据框.

我的数据框

Col1 col2

0 A event1

1 A event2

2 A event3

3 A event2

4 B event1

5 B event3

6 B event2

7 B event2

输出数据框

Col1 col2

A event1

B event1

B event3

它应该为每个组返回event2之前的行.

到目前为止,我尝试过

df.groupby('col1').apply(lambda x :x[0:x[x['col2'] == 'event2'].index[0]])

但是它没有返回所需的行.

解决方法:

我们可以使用groupby和cumsum进行此操作,然后执行最后的过滤步骤:

df[df.col2.eq('event2').groupby(df.Col1).cumsum().eq(0)]

Col1 col2

0 A event1

4 B event1

5 B event3

要将索引重置为单调递增的范围,请使用

df[df.col2.eq('event2').groupby(df.Col1).cumsum().eq(0)].reset_index(drop=True)

Col1 col2

0 A event1

1 B event1

2 B event3

Scott Boston建议在布尔型面罩上使用cumprod对上述解决方案进行很好的改进.原理是相同的,但是更干净:

df[df.col2.ne('event2').groupby(df.Col1).cumprod()]

Col1 col2

0 A event1

4 B event1

5 B event3

W-B建议的基于groupby idxmax的过滤:

df[df.index < df.col2.eq('event2').groupby(df.Col1).transform('idxmax')]

Col1 col2

0 A event1

4 B event1

5 B event3

标签:pandas-groupby,pandas,dataframe,python,group-by

来源: https://codeday.me/bug/20191024/1923743.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值