我有以下資料框:
user category x y
0 AB A 1 1
1 EF A 1 1
2 SG A 1 0
3 MN A 1 0
4 AB B 0 0
5 EF B 0 1
6 SG B 0 1
7 MN B 0 0
8 AB C 1 1
9 EF C 1 1
10 SG C 1 1
11 MN C 1 1
我想選擇x=y所有類別的用戶。我能夠使用以下代碼做到這一點:
data = pd.DataFrame({'user': ['AB', 'EF', 'SG', 'MN', 'AB', 'EF',
'SG', 'MN', 'AB', 'EF', 'SG', 'MN'],
'category': ['A', 'A', 'A', 'A', 'B', 'B',
'B', 'B', 'C', 'C', 'C', 'C'],
'x': [1,1,1,1, 0,0,0,0, 1,1,1,1],
'y': [1,1,0,0, 0,1,1,0, 1,1,1,1]})
data = data[data['x'] == data['y']][['user', 'category']]
count_users_match = data.groupby('user', as_index=False).count()
count_cat = data['category'].unique().shape[0]
print(count_users_match[count_users_match['category'] == count_cat])
輸出:
user category
0 AB 3
我覺得這是一個相當長的解決方案。有沒有更短的方法來實作這一目標?
uj5u.com熱心網友回復:
嘗試這個:
filtered = df.x.eq(df.y).groupby(df['user']).sum().loc[lambda x: x == df['category'].nunique()].reset_index(name='category')
輸出:
>>> filtered
user category
0 AB 3
uj5u.com熱心網友回復:
我們可以使用query groupby來size查找每個用戶的匹配類別數。然后將其與每個用戶的類別數量進行比較:
tmp = data.query('x==y').groupby('user').size()
out = tmp[tmp == data['category'].nunique()].reset_index(name='category')
輸出:
user category
0 AB 3
uj5u.com熱心網友回復:
這是一種更緊湊的方法,但我不知道它是否也更有效。
out = [{'user': user, 'frequency': data.loc[data['x'] == data['y']]['user'].value_counts()[user]} for user in data['user'].unique() if data.loc[data['x'] == data['y']]['user'].value_counts()[user] == data['user'].value_counts()[user]]
>>> out
[{'user': 'AB', 'frequency': 3}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441245.html
標籤:Python 熊猫 数据框 选择 熊猫-groupby
上一篇:將帶有元組的幾列拆分為單獨的列
