我想根据两个不同列上的两个条件过滤数据框。在下面的示例中,我想过滤数据框df以包含行,以便它包含uids,列的值计数val大于 4 大于 2。df = pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,12,13,13,14,14,11,12], 'val':[3,4,5,3,5,4,5,4,3,4]})对于这个数据框,我的输出应该是 df uid iid val0 1 11 31 1 12 42 1 13 55 3 13 46 3 14 57 4 14 48 4 11 39 4 12 4在这里,我过滤掉了uid2 的行数,因为uid == 2行数val >= 4小于 2。我只想保留值大于 4 的行数大于或等于 2。uidval
1 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
您需要groupby.transform一次sum检查 val 大于或等于ge4 的位置。并检查结果是否将ge其用作 df 上的布尔过滤器。
print (df[df['val'].ge(4).groupby(df['uid']).transform(sum).ge(2)])
uid iid val
0 1 11 3
1 1 12 4
2 1 13 5
5 3 13 4
6 3 14 5
7 4 14 4
8 4 11 3
9 4 12 4
编辑:另一种避免方法groupby.transform是对val小于 4 的行和 uidloc列,在其上使用并在2 处获取 True。然后返回 uid 列以在 df 上创建布尔过滤器。结果相同,而且可能更快。gevalue_countsgemap
df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]
添加回答
举报
0/150
提交
取消