如何为DataFrame按条件生成新列?解决返回Series而非值的问题
解决方案
先构造示例DataFrame用于测试:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, 11, 111], 'B': [2, 22, 222], 'C': [3, 33, 333] })
以下是几种简单高效的实现方式,都能直接生成由单个值组成的D列,避免返回Series列表的问题:
方法1:np.select(推荐,大数据场景效率最优)
通过定义条件列表和对应取值序列,直接批量生成结果:
# 定义匹配条件 conditions = [ df['A'] == 1, df['A'] == 11, df['A'] == 111 # 可按需扩展更多规则 ] # 对应条件的取值列 choices = [ df['B'], df['C'], df['B'] # 这里假设A=111时取B列,可根据实际需求修改 ] # 生成D列,default为未匹配条件时的默认值 df['D'] = np.select(conditions, choices, default=np.nan)
方法2:apply逐行处理(规则灵活时适用)
通过自定义函数逐行判断取值,指定axis=1按行处理:
def get_d_value(row): if row['A'] == 1: return row['B'] elif row['A'] == 11: return row['C'] elif row['A'] == 111: return row['B'] else: return np.nan df['D'] = df.apply(get_d_value, axis=1)
方法3:字典映射+lookup(映射关系明确时更简洁)
如果A列的值和目标列有固定映射关系,可通过字典快速匹配:
# 定义A值到目标列名的映射 col_map = {1: 'B', 11: 'C', 111: 'B'} # 先将A值转换为对应列名,再通过lookup取对应位置的值 df['D'] = df.lookup(df.index, df['A'].map(col_map))
内容的提问来源于stack exchange,提问作者Kelvin Yeung
相关产品推荐
相关产品推荐

