首页 > 解决方案 > 基于条件的分组和子集行

问题描述

我想过滤我的数据框。

我的数据框

  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]])

但它没有返回所需的行。

标签: pythonpandasdataframegroup-bypandas-groupby

解决方案


我们可以用groupbyand来做到这一点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

cumprodScott Boston 建议使用布尔掩码对上述解决方案进行很好的改进。原理是一样的,但是更干净:

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

  Col1    col2
0    A  event1
4    B  event1
5    B  event3

groupby+ idxmaxWB建议的基于过滤:

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

  Col1    col2
0    A  event1
4    B  event1
5    B  event3

推荐阅读