2017-06-22 197 views
0

我只是想保持行的熊貓數據幀滿足下列條件:當第二個條件滿足時,第一個條件不滿足

1)用戶應已與之互動的超過X項目 2)項目應已與之互動與超過Y用戶

當滿足第二個條件,應用這兩個條件後,對於某些用戶,第一個條件失敗。

groupById = df.groupby(['id']).count() 
remaining = groupById[groupById.itemId > X] 
df2 = df.loc[df.id.isin(remaining.index)] 

groupByItem = df2.groupby(['id']).count() 
remainingIt = groupByItem[groupByItem.id > Y] 
final = df[df.id.isin(remaining.index) & df.itemId.isin(remainingIt.index)] 

我無法理解這個遞歸問題。任何人?

+0

你是如何確定第一條件失敗? – EFT

+1

也許當你計算第一個條件,你使用所有的項目(過濾之前),並在你過濾後,你顯然有更少的項目,所以第一個條件可能會失敗 – Dotan

回答

1

問題是您在移除未超過X次交互的用戶之後對項目進行分組。你首先需要在兩種情況下獨立檢查,然後結合結果。 import pandas as pd

#set threshold X and Y 
X=1 
Y=2 
#fill dataframe with some users and items 
users=pd.Series(['U1','U1','U1','U2']) 
items=pd.Series(['Y1','Y2','Y3','Y1']) 
frame=pd.DataFrame() 
frame['user'] = users.values 
frame['item'] = items.values 
    user item 
0 U1 Y1 
1 U1 Y2 
2 U1 Y3 
3 U2 Y1 

#groupby item and user 
groupByItem=frame.groupby('item').count().reset_index() 
groupByUser=frame.groupby('user').count().reset_index() 
item user 
0 Y1  2 
1 Y2  1 
2 Y3  1 
    user item 
0 U1  3 
1 U2  1 

#filter both on condition 
filteredItems=groupByItem.loc[groupByItem['user']>X] 
filteredUsers=groupByUser.loc[groupByUser['item']>Y] 

#only take records where both user and items appear in filtered list 
print(frame[frame['user'].isin(filteredUsers.user) & frame['item'].isin(filteredItems.item)]) 

    user item 
0 U1 Y1 

希望這有助於