如何在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"] })
解决方案
- 先将数据中的字符串"NaN"转换为Pandas可识别的缺失值
np.nan; - 对每行数据提取非缺失值,统计唯一值的数量,根据规则生成
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
相关产品推荐
相关产品推荐

