You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pandas数据框中每个用户的首行设置is_favorite为True

如何为每个用户的首行设置is_favorite=True

我有一个包含user、food和is_favorite字段的表格,同一用户会出现在多行中。需要为每个用户恰好设置一行的is_favorite=True(首行),目标效果如下:

初始表格

userfoodis_favorite
1BeefFalse
1PorkFalse
3PorkFalse
3BeefFalse
3PotatoesFalse
4BeefFalse

目标表格

userfoodis_favorite
1BeefTrue
1PorkFalse
3PorkTrue
3BeefFalse
3PotatoesFalse
4BeefTrue

我已经能获取每个用户的首行数据,但没法把设置应用到原DataFrame里,试了下面的代码但没成功,求正确实现方式:

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]))

# 这部分能正常获取每个用户的首行
first_food_per_user = df.groupby('user').nth(0).reset_index()

# 这部分代码不生效
for _, row in first_food_per_user.iterrows():
    df['is_favorite'].loc[
        (df['user'] == row['user'])
        &
        df['food'] == row['food'],
    ] = True

解决方法

方法1:高效的向量化操作(推荐)

不需要循环,直接用groupby.cumcount()标记每个用户的首行,一步完成赋值:

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]))

# 给每个用户的行从0开始计数,首行对应0,直接赋值布尔值
df['is_favorite'] = df.groupby('user').cumcount() == 0

print(df)

方法2:修正你的循环代码

原代码的问题在于链式索引(df['is_favorite'].loc[...])可能创建了数据副本,导致修改不生效。改成直接通过df.loc[条件, 列名]操作原DataFrame即可:

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]))

first_food_per_user = df.groupby('user').nth(0).reset_index()

for _, row in first_food_per_user.iterrows():
    # 直接用df.loc定位行和列
    df.loc[
        (df['user'] == row['user']) & (df['food'] == row['food']),
        'is_favorite'
    ] = True

print(df)

内容的提问来源于stack exchange,提问作者PythonForEver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:45:38