2017-03-08 50 views
4

的三胞胎訪問我有一個包含用戶訪問過的項目對一個CSV文件,如項目的三胞胎:的Python:如何找到用戶

user_id item_id 
370 293 
471 380 
280 100 
280 118 
219 118 
... 

名單很長 - 30M行。

我需要找到三個用戶訪問的項目的三元組(即,所有三個用戶訪問了所有三個項目)。這樣的三胞胎很少見。示例結果,我試圖找到:

user_id item_id 
1 15 
1 26 
1 31 
77 15 
77 26 
77 31 
45 15 
45 26 
45 31 

什麼是一個很好的方法來做到這一點?我可以使用熊貓或任何其他圖書館。

回答

2

您可以使用transformsize然後boolean indexing過濾:

print (df) 
    user_id item_id 
0   1  15 
1   1  26 
2   1  31 
3  77  15 
4  77  26 
5  77  31 
6  45  15 
7  45  26 
8  45  31 
9  370  293 
10  471  380 
11  280  100 
12  280  118 
13  219  118 
print (df.groupby('user_id')['item_id'].transform('size')) 
0  3 
1  3 
2  3 
3  3 
4  3 
5  3 
6  3 
7  3 
8  3 
9  1 
10 1 
11 2 
12 2 
13 1 
Name: item_id, dtype: int64 

print (df[df.groupby('user_id')['item_id'].transform('size') == 3]) 
    user_id item_id 
0  1  15 
1  1  26 
2  1  31 
3  77  15 
4  77  26 
5  77  31 
6  45  15 
7  45  26 
8  45  31 

filtration解決辦法是slowier:

df = df.groupby('user_id').filter(lambda x: len(x.item_id) == 3) 
print (df) 
    user_id item_id 
0  1  15 
1  1  26 
2  1  31 
3  77  15 
4  77  26 
5  77  31 
6  45  15 
7  45  26 
8  45  31 
+0

解決方案的工作在這種情況下,但它不會在一般情況下工作。例如: 'df = pd.DataFrame( { 'user_id':[1,2,1,77,70,77,45,45,45,370,471,280,280,219], ' item_id':[15,26,31,15,26,31,15,26,31,293,380,100,118,118] } ) print(df [df.groupby('user_id')[ 'item_id']。transform('size')== 3]) ' 應該返回任何東西,但它返回user_id = 45和項目15,26和31.但我需要三個用戶和三個項目。有三個項目的用戶是不夠的。 – JustAC0der

+0

我明白了。對不起,給我一個時間 – jezrael

+0

好吧,現在它明白更好。那麼如果有兩個三重三聯體呢?你能添加樣品嗎? – jezrael