编程语言
首页 > 编程语言> > 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