基于D/F/M/P列创建Result新列的Pandas技术咨询
嘿,这问题我刚好碰过类似的,给你两个靠谱的解决方案,按需选就行!
方案一:直观逐行处理(适合小数据集)
这个方法逻辑清晰,容易理解,用apply逐行统计非NaN值的出现次数,再按规则返回结果:
import pandas as pd import numpy as np # 初始化你的原始DataFrame df_start = pd.DataFrame({ 'P':['IG','HY','IG',np.nan,'HY'], 'M':['HY','HY','IG', np.nan,'IG'], 'F':['HY',np.nan,'HY', np.nan,'IG'], 'D':['IG','IG','IG', 'HY','IG'] }) def get_result_row(row): # 先过滤掉当前行的所有NaN值 valid_values = row.dropna() # 如果整行都是NaN(示例里没这种情况,可按需调整返回值) if valid_values.empty: return np.nan # 统计每个有效取值的出现次数 count_stats = valid_values.value_counts() # 检查IG和HY的次数是否持平,持平就返回HY if count_stats.get('IG', 0) == count_stats.get('HY', 0): return 'HY' # 否则返回出现次数最多的取值 return count_stats.idxmax() # 给DataFrame添加Result列,注意指定处理的列顺序是D、F、M、P df_start['Result'] = df_start[['D', 'F', 'M', 'P']].apply(get_result_row, axis=1)
运行后你得到的df_start就和你期望的df_result完全一致啦!
方案二:向量化操作(适合大数据集,性能拉满)
如果你的数据集很大,apply逐行循环会有点慢,用向量化方法会高效很多,核心是直接统计每行IG和HY的数量,再用条件判断赋值:
import pandas as pd import numpy as np df_start = pd.DataFrame({ 'P':['IG','HY','IG',np.nan,'HY'], 'M':['HY','HY','IG', np.nan,'IG'], 'F':['HY',np.nan,'HY', np.nan,'IG'], 'D':['IG','IG','IG', 'HY','IG'] }) # 指定要统计的列:D、F、M、P target_cols = ['D', 'F', 'M', 'P'] # 统计每行中IG的出现次数(NaN会被自动排除,因为eq('IG')对NaN返回False) ig_total = df_start[target_cols].eq('IG').sum(axis=1) # 统计每行中HY的出现次数 hy_total = df_start[target_cols].eq('HY').sum(axis=1) # 按规则赋值:HY次数≥IG时返回HY,否则返回IG(完美覆盖持平的情况) df_start['Result'] = np.where(hy_total >= ig_total, 'HY', 'IG')
这个方法没有循环,全是Pandas的向量化运算,速度快很多,结果和方案一完全一样。
你可以打印df_start看看,和你给出的df_result完全匹配哦!
内容的提问来源于stack exchange,提问作者muchappreciated
相关产品推荐
相关产品推荐

