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

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列统一赋值,赋值规则:

  1. 同组所有Category原值均为a,统一赋值为a
  2. 同组Category原值同时包含a、b,统一赋值为b
  3. 同组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:57:19