我有一個熊貓數(shù)據(jù)框,我想以一種我尚未發(fā)現(xiàn)的方式在過濾器之后應(yīng)用過濾器。為了提供更多上下文,A 列是不同 IP 的占位符,而 B 列是公司 ID 的占位符。我希望第一個過濾器查看 IP 出現(xiàn)的次數(shù)。如果 IP 僅出現(xiàn)一次或 IP 出現(xiàn)超過 3 次,則應(yīng)排除這些行。這部分,我設(shè)法解決了。問題是,現(xiàn)在,我希望保留在數(shù)據(jù)庫中的每個 IP 至少可以訪問 2 個不同的公司。代碼發(fā)布在下面,之后會有輸出和預(yù)期輸出。import pandas as pddf = pd.DataFrame({'A': ['001', '001', '002', '003', '003', '003', '003', '004', '004'], 'B': ['firm_a', 'firm_a', 'firm_b', 'firm_a', 'firm_c', 'firm_d', 'firm_a', 'firm_a', 'firm_b']}, index=[0, 1, 2, 3, 4, 5, 6, 7, 8])df = df.groupby('A').filter(lambda x: len(x) > 1)df = df.groupby('A').filter(lambda x: len(x) < 4)print(df)電流輸出: A B0 001 firm_a1 001 firm_a7 004 firm_a8 004 firm_b現(xiàn)在,我想實現(xiàn)第二個過濾器,檢查一個 IP 是否訪問了至少 2 個不同的公司。在提供的示例中,預(yù)期輸出如下: A B7 004 firm_a8 004 firm_b如您所見,IP 001 被刪除,因為它通過了第一個過濾器(訪問了 2 個或更多公司),但它訪問了同一家公司并被淘汰。我不知道如何實現(xiàn)第二部分。我試著環(huán)顧四周,雖然有很多關(guān)于過濾的 Pandas 教程,但我沒有找到適合我的問題的東西。雖然是的,但我可以通過將每個 IP 分開并獲取訪問公司的列表、消除重復(fù)項并查看列表的長度是否大于 1 來在 python 中執(zhí)行此操作,這在計算上非常昂貴。我有接近 10 億行,這樣做會花費太多時間。有什么聰明的方法可以設(shè)置嗎?
1 回答

楊魅力
TA貢獻1811條經(jīng)驗 獲得超6個贊
您可以將groupby+transform與nunique:
res = df[df.groupby('A')['B'].transform('nunique') >= 2]
print(res)
A B
7 4 firm_a
8 4 firm_b
添加回答
舉報
0/150
提交
取消