如何为Pandas数据框中每个用户的首行设置is_favorite为True
如何为每个用户的首行设置
is_favorite=True 我有一个包含user、food和is_favorite字段的表格,同一用户会出现在多行中。需要为每个用户恰好设置一行的is_favorite=True(首行),目标效果如下:
初始表格
| user | food | is_favorite |
|---|---|---|
| 1 | Beef | False |
| 1 | Pork | False |
| 3 | Pork | False |
| 3 | Beef | False |
| 3 | Potatoes | False |
| 4 | Beef | False |
目标表格
| user | food | is_favorite |
|---|---|---|
| 1 | Beef | True |
| 1 | Pork | False |
| 3 | Pork | True |
| 3 | Beef | False |
| 3 | Potatoes | False |
| 4 | Beef | True |
我已经能获取每个用户的首行数据,但没法把设置应用到原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
相关产品推荐
相关产品推荐

