pandas 仅替换每个用户的第一行

yhxst69z  于 2023-04-04  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个表,有用户,食物,哪一个是他们的最爱。
| 用户|食物|是收藏夹|
| --------------|--------------|--------------|
| 1|牛肉|假的|
| 1|Pig肉|假的|
| 三|Pig肉|假的|
| 三|牛肉|假的|
| 三|马铃薯|假的|
| 四|牛肉|假的|
同一个用户出现在多行中。我需要将其中一行 * 每个用户 * 设置为收藏夹(is_favorite =True):
| 用户|食物|是收藏夹|
| --------------|--------------|--------------|
| 1|牛肉|真的|
| 1|Pig肉|假的|
| 三|Pig肉|真的|
| 三|牛肉|假的|
| 三|马铃薯|假的|
| 四|牛肉|真的|
现在每个用户都有一个最喜欢的食物。
我成功地为每个用户获取了1行,但无法将其应用于我的初始df。我很确定我缺少一些简单的东西,但我不太了解pandas。这也感觉这样做是错误的:

import pandas as pd

df = pd.DataFrame(
    dict(
        user=[1, 1, 3, 3, 3, 4],
        food=['Beef', 'Pork', 'Pork', 'Beef', 'Potatoes', 'Beef'],
        is_favorite=[False, False, False, False, False, False]))

# This works. It gives me exactly 1 row per user
first_food_per_user = df.groupby('user').nth(0).reset_index()

# This doesn't work
for _, row in first_food_per_user.iterrows():
    df['is_favorite'].loc[
        (df['user'] == row['user'])
        &
        df['food'] == row['food'],
    ] = True
0x6upsns

0x6upsns1#

不需要groupby,只需要使用duplicated和布尔索引:

df.loc[~df['user'].duplicated(), 'is_favorite'] = True

输出:

user      food  is_favorite
0     1      Beef         True
1     1      Pork        False
2     3      Pork         True
3     3      Beef        False
4     3  Potatoes        False
5     4      Beef         True

如果你想设置一个随机行,使用groupby.sample

idx = df.groupby('user')['is_favorite'].sample(n=1).index
df.loc[idx, 'is_favorite'] = True

示例:

user      food  is_favorite
0     1      Beef         True
1     1      Pork        False
2     3      Pork        False
3     3      Beef         True
4     3  Potatoes        False
5     4      Beef         True

相关问题