這是我的資料框:
df = pd.DataFrame({
'User': ["alex", "alex", "ravi", "dodo", "dodo", "dodo", "cokie","dodo","nemo","ravi"],
'Id': ['a', 'b', 'b', 'a', 'b', 'b', 'c','a','e','b']
})
這是我的資料框的樣子:
User Id
0 alex a
1 alex b
2 ravi b
3 dodo a
4 dodo b
5 dodo b
6 cokie c
7 dodo a
8 nemo e
9 ravi b
我首先使用以下代碼計算每個用戶的專案數:
df_group = df.groupby(['User', 'Id'])
# size of group to count observations
df_group = df_group.size()
# make a column name
df_group = df_group.reset_index(name='Observation')
這是它的外觀:
User Id Observation
0 alex a 1
1 alex b 1
2 cokie c 1
3 dodo a 2
4 dodo b 2
5 nemo e 1
6 ravi b 2
我想洗掉一個來了 1 次并且觀察值為 1 的用戶。例如用戶 nemo 和 cokie。但我不想洗掉用戶 alex,即使專案 a 和 b 出現 1 次或用戶 ravi。
我該怎么做?
我的最終目標:
User Id Observation
0 alex a 1
1 alex b 1
3 dodo a 2
4 dodo b 2
6 ravi b 2
uj5u.com熱心網友回復:
要以自動方式執行此操作,我建議在.groupby(['User']).filter(lambda x: len(x)用于過濾僅出現一次的用戶之后使用合并。
df_group = df.groupby(['User', 'Id'])
# size of group to count observations
df_group = df_group.size()
# make a column name
df_group = df_group.reset_index(name='Observation').merge(df.groupby(['User']).filter(lambda x: len(x) > 1)).drop_duplicates()
哪些輸出:
User Id Observation
0 alex a 1
1 alex b 1
2 dodo a 2
4 dodo b 2
6 ravi b 2
或者不使用merge:
df_group = df.groupby(['User', 'Id'],as_index=False)
# size of group to count observations
df_group = df_group.size()
# make a column name
df_group = df_group.loc[df_group['User'].isin(df.groupby(['User']).filter(lambda x: len(x) > 1)['User'].unique())]
uj5u.com熱心網友回復:
這有效:
s = df.groupby('User').size() > 1
df = df.merge(df_group, how='left')[df['User'].isin(s[s].index)].drop_duplicates()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/358440.html
