如何替换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
相关产品推荐
相关产品推荐

