Pandas如何基于指定列返回每行符合自定义规则的最高频值
解决代码
import pandas as pd from collections import Counter # 构造原始DataFrame data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Book1':[20, 21, 19, 18], 'Book2':[20,'', 12, 20], 'Book3':[31, 21, 17, 16], 'Book4':[31, 19, 18, 16]} df = pd.DataFrame(data) # 定义行处理逻辑 def cal_output(row): # 按列顺序取有效值,过滤空字符串 valid_vals = [row[col] for col in ['Book1','Book2','Book3','Book4'] if row[col] != ''] # 统计值出现次数 count_dict = Counter(valid_vals) max_count = max(count_dict.values()) # 筛选所有最高频值 high_freq_vals = [k for k,v in count_dict.items() if v == max_count] # 所有值无重复返回Mix if max_count == 1: return 'Mix' # 按列顺序返回第一个出现的最高频值 for val in valid_vals: if val in high_freq_vals: return val # 生成Output列 df['Output'] = df.apply(cal_output, axis=1) # 打印结果 print(df)
逻辑说明
内置的mode()方法会返回所有众数,无法匹配「同频次优先取列顺序靠前的值」的规则,自定义函数可以完全匹配需求:
- 第一步先过滤空值,避免空字符串干扰统计结果
- 统计完频次后如果最高频次为1,直接返回
Mix - 同频次的情况下按原始列顺序遍历取值,确保第一个出现的高频值优先返回
运行后输出结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Shi Jie Tio
相关产品推荐
相关产品推荐

