pandas根据条件及其他列值修改DataFrame列值的实现方法
pandas按分组统一赋值Category列实现方法
需求说明
现有包含Category、DishName、Id三列的DataFrame,初始样例数据如下:
Category DishName Id 0 a Pistachio 621f4884e48bc60012364b13 1 a Pistachio 621f4884e48bc60012364b13 2 a Pistachio 621f4884e48bc60012364b13 3 a achar 621f4884e48bc60012364b13 4 b achar 621f4884e48bc60012364b13 5 b achar 621f4884e48bc60012364b13 6 a chicken 621f4884e48bc60012364b13 7 b chicken 621f4884e48bc60012364b13 8 c chicken 621f4884e48bc60012364b13
需要按Id和DishName字段分组,同组所有行的Category列统一赋值,赋值规则:
- 同组所有
Category原值均为a,统一赋值为a - 同组
Category原值同时包含a、b,统一赋值为b - 同组
Category原值同时包含a、b、c,统一赋值为c
预期输出如下:
Category DishName Id 0 a Pistachio 621f4884e48bc60012364b13 1 a Pistachio 621f4884e48bc60012364b13 2 a Pistachio 621f4884e48bc60012364b13 3 b achar 621f4884e48bc60012364b13 4 b achar 621f4884e48bc60012364b13 5 b achar 621f4884e48bc60012364b13 6 c chicken 621f4884e48bc60012364b13 7 c chicken 621f4884e48bc60012364b13 8 c chicken 621f4884e48bc60012364b13
实现代码
观察规则可以发现,赋值优先级c > b > a,刚好和字母序排序结果一致,直接取分组内Category列的最大值即可满足要求,代码最简洁:
import pandas as pd # --------------- 样例数据构造 --------------- df = pd.DataFrame({ 'Category': ['a','a','a','a','b','b','a','b','c'], 'DishName': ['Pistachio','Pistachio','Pistachio','achar','achar','achar','chicken','chicken','chicken'], 'Id': ['621f4884e48bc60012364b13']*9 }) # --------------- 核心处理逻辑 --------------- df['Category'] = df.groupby(['Id', 'DishName'])['Category'].transform('max')
运行后df的输出和预期完全一致。
扩展场景适配
如果后续Category新增其他值、或者优先级和字母序不匹配,可以通过自定义优先级映射实现:
# 定义优先级,数值越大优先级越高 priority = {'a': 1, 'b': 2, 'c': 3} df['Category'] = ( df # 新增优先级列 .assign(_p=df['Category'].map(priority)) # 按分组取优先级最高的行对应的Category .groupby(['Id', 'DishName'])['_p'] .transform(lambda s: df.loc[s.idxmax(), 'Category']) )
内容的提问来源于stack exchange,提问作者Mila
相关产品推荐
相关产品推荐

