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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:45:50