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