慕碼人8056858
2023-03-01 15:59:58
我想根據(jù)兩個(gè)不同列上的兩個(gè)條件過濾數(shù)據(jù)框。在下面的示例中,我想過濾數(shù)據(jù)框df以包含行,以便它包含uids,列的值計(jì)數(shù)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]})對于這個(gè)數(shù)據(jù)框,我的輸出應(yīng)該是 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 的行數(shù),因?yàn)閡id == 2行數(shù)val >= 4小于 2。我只想保留值大于 4 的行數(shù)大于或等于 2。uidval
1 回答

翻閱古今
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
您需要groupby.transform一次sum檢查 val 大于或等于ge4 的位置。并檢查結(jié)果是否將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 上創(chuàng)建布爾過濾器。結(jié)果相同,而且可能更快。gevalue_countsgemap
df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]
添加回答
舉報(bào)
0/150
提交
取消