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
and来做到这一点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
cumprod
Scott Boston 建议使用布尔掩码对上述解决方案进行很好的改进。原理是一样的,但是更干净:
df[df.col2.ne('event2').groupby(df.Col1).cumprod()]
Col1 col2
0 A event1
4 B event1
5 B event3
groupby
+ idxmax
WB建议的基于过滤:
df[df.index < df.col2.eq('event2').groupby(df.Col1).transform('idxmax')]
Col1 col2
0 A event1
4 B event1
5 B event3
推荐阅读
- python - 需要帮助或理解
- windows - 从 Android Studio 运行我的应用程序时,我可以强制模拟器到顶部吗?
- css - iPhone XR / XS / XS Max CSS 媒体查询
- scala - 现在 22 不再是限制,Scala 案例类中允许的实际最大字段数是多少?
- linux - 查找:在 Linux 中缺少“-exec”的参数
- javascript - 文本区域的动态高度
- c# - roslyn 未使用 PackageReference 和 Microsoft.CodeDom.Providers 2.0.0 复制到 AspNet Mvc 5 项目的 bin
- postman - 读取作为文本发布到金字塔网络应用程序的文件
- excel - VBA按索引打印到PDF多张纸?
- angular - Pro FontAwesome 图标“找不到图标”