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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:50:04