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

如何在Pandas中基于多列非NaN值生成新列?

解决Pandas DataFrame新增列c4的需求

需求说明

需在Pandas DataFrame中新增列c4,生成规则如下:

  • 若c1、c2、c3列中的非NaN值仅存在1种唯一值,则将该值填入c4;
  • 若存在2种不同的非NaN值,则在c4中填入"both"。

注:仅c2和c3列存在少量NaN值,NaN不视为有效取值(示例中的"NaN"为字符串形式,需先转换为Pandas可识别的缺失值)。

示例数据

原始DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "c1": ["left", "right", "right", "left", "left","right"], 
    "c2": ["left", "right", "right", "right", "NaN","right"], 
    "c3": ["NaN", "NaN", "left", "NaN", "left","right"]
})

目标结果DataFrame:

answerdf = pd.DataFrame({
    "c1": ["left", "right", "right", "left", "left","right"], 
    "c2": ["left", "right", "right", "right", "NaN","right"], 
    "c3": ["NaN", "NaN", "left", "NaN", "left","right"], 
    "c4": ["left", "right", "both", "both", "left","right"] 
})

解决方案

  1. 先将数据中的字符串"NaN"转换为Pandas可识别的缺失值np.nan;
  2. 对每行数据提取非缺失值,统计唯一值的数量,根据规则生成c4列的值。

实现代码如下:

# 转换字符串"NaN"为真正的缺失值
df.replace("NaN", np.nan, inplace=True)

# 定义处理每行的函数
def get_c4(row):
    # 获取当前行非NaN的所有值
    non_nan_vals = row.dropna().values
    # 统计唯一值数量
    unique_vals = np.unique(non_nan_vals)
    if len(unique_vals) == 1:
        return unique_vals[0]
    elif len(unique_vals) == 2:
        return "both"
    # 按需求场景,此处不会出现超过2种唯一值的情况,可根据实际需求扩展逻辑
    else:
        return None

# 生成c4列
df["c4"] = df.apply(get_c4, axis=1)

# 查看结果
print(df)

验证结果

运行上述代码后,得到的DataFrame与目标answerdf完全一致:

c1     c2     c3     c4
0    left   left    NaN   left
1   right  right    NaN  right
2   right  right   left   both
3    left  right    NaN   both
4    left    NaN   left   left
5   right  right  right  right

内容的提问来源于stack exchange,提问作者AAA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:28