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

如何基于Pandas DataFrame的D列值从A1-A4列生成新列E?

解决Pandas根据指定列取值生成新列的问题

嘿,我来帮你搞定这个需求!你的目标是根据D列的数字(1-4),从对应的A1-A4列中提取值生成E列对吧?之前用apply没成功没关系,咱们用更高效、更简洁的方法来实现。

首先先把你的示例数据复现出来,方便测试:

import pandas as pd
import numpy as np

data = {
    'A1': [0,7,3],
    'A2': [2,6,7],
    'A3': [9,7,4],
    'A4': [0,3,9],
    'B': [9,6,2],
    'C': [7,8,1],
    'D': [2,4,1]
}
df = pd.DataFrame(data)

方法一:使用lookup(适合旧版Pandas)

lookup可以直接根据行索引和列名来提取对应的值,刚好匹配你的需求:

# 把D列的数字转换成对应的列名(比如D=2 → 'A2')
target_cols = 'A' + df['D'].astype(str)
# 提取对应位置的值生成E列
df['E'] = df.lookup(df.index, target_cols)

运行后就能得到你想要的结果啦!不过要注意:Pandas 1.2.0之后lookup被标记为弃用,如果你用的是新版本,推荐下面的方法。

方法二:用numpy.take_along_axis(高效推荐)

这个方法更高效,适合大数据集,而且是官方推荐的lookup替代方案:

# 先提取所有以A开头的列(A1-A4)
a_columns = df.filter(like='A')
# 把D列的1-4转换成0-3的索引(因为Python是0起始索引)
col_indices = df['D'].values - 1
# 生成行索引数组
row_indices = np.arange(len(df))[:, np.newaxis]
# 提取对应位置的值并扁平化
df['E'] = np.take_along_axis(a_columns.values, col_indices[:, np.newaxis], axis=1).flatten()

方法三:用melt转格式后匹配(逻辑清晰)

如果你喜欢逻辑更直观的方式,可以把A列转成长格式后再匹配:

# 将A1-A4转成长格式,保留D列作为匹配键
melted_df = df.melt(
    id_vars=['D'],
    value_vars=['A1', 'A2', 'A3', 'A4'],
    var_name='A_column',
    value_name='E'
)
# 提取A列名里的数字,和D列匹配
melted_df['A_num'] = melted_df['A_column'].str.extract('(\d+)').astype(int)
# 筛选出D和A_num匹配的行,合并回原DataFrame
df = df.merge(
    melted_df[melted_df['A_num'] == melted_df['D']][['E']],
    left_index=True,
    right_index=True
)

至于你之前用apply没成功,大概率是因为逐行处理时没有正确构建目标列名,或者处理逻辑有误。上面的方法都比apply高效得多,尤其是数据量大的时候,尽量避免用apply逐行处理哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:54