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

如何替换DataFrame中重复Case的Case Info值:非OTHER值优先

问题:按Case统一Case Info,非OTHER值优先

原始数据

Year-Week    Case    Team     Case Info
2022-42      540    Finance    OTHER
2022-42      540    IT         ACCEPTED
2022-42      480    Sales      OTHER
2022-42      480    Finance    CHECK CASE
2022-42      480    IT         OTHER
2022-42      465    IT         OTHER
2022-42      465    Sales      OTHER
2022-42      310    Legal      VALIDATED
2022-42      310    Marketing  OTHER

需求

同一Case对应的多条数据中,只要存在非OTHER的Case Info值,就将该Case下所有行的Case Info统一替换为这个非OTHER值;若该Case下全是OTHER,则保留OTHER。

原方法问题

之前尝试用df['Case Info'] = df.groupby('Case')['Case Info'].transform('max'),但该方法依赖ASCII字符排序逻辑,无法精准实现“非OTHER优先”的规则,仅能部分满足需求。

解决方案

方法一:自定义分组转换函数

通过自定义函数筛选每个Case组内的非OTHER值,优先采用该值:

def get_preferred_info(group):
    # 提取组内非OTHER的Case Info
    non_other_entries = group[group != 'OTHER']
    if not non_other_entries.empty:
        # 若存在非OTHER值,取第一个(可根据需求调整,比如指定优先级顺序)
        return non_other_entries.iloc[0]
    # 全为OTHER时返回原值
    return 'OTHER'

# 分组应用函数,替换Case Info
df['Case Info'] = df.groupby('Case')['Case Info'].transform(get_preferred_info)

方法二:排序去重后合并

通过排序让非OTHER值排在每组首位,去重后合并回原数据:

# 排序:将非OTHER值放在每组的最前面
df_sorted = df.sort_values(
    by=['Case', 'Case Info'],
    key=lambda col: col == 'OTHER'  # OTHER会被标记为True(1),排序后靠后
)
# 按Case去重,保留每组第一个值(即非OTHER值)
case_preferences = df_sorted.drop_duplicates(subset='Case', keep='first')[['Case', 'Case Info']]
# 合并回原数据,替换Case Info
df = df.merge(case_preferences, on='Case', suffixes=('', '_pref'))
df['Case Info'] = df['Case Info_pref']
df.drop(columns='Case Info_pref', inplace=True)

两种方法均不依赖字符排序,能精准实现“非OTHER优先”的规则。如果同一Case存在多个不同的非OTHER值,可根据实际需求调整逻辑(比如指定值的优先级顺序)。

内容的提问来源于stack exchange,提问作者exenlediatán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:20:36