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

如何基于Pandas DataFrame的列名列提取对应值生成新列?

Pandas根据指定列名提取对应行值的高效实现

问题说明

现有Pandas DataFrame,其中col3列存储了DataFrame其他列的名称(如col1、col2)。需要新增col4列,根据col3每行的列名,提取对应列的同行值填充。业务场景存在重复值,当前通过循环实现但属于低效反模式,需更优方案。

示例数据

初始示例:

import pandas as pd
d = {'col1': [1, 2], 'col2': [3, 4], 'col3':['col1', 'col2']}
df = pd.DataFrame(data=d)

含重复值的场景:

import pandas as pd
d = {'col1': [1, 2, 1], 'col2': [3, 4, 1], 'col3':['col1','col2', 'col1']}
df = pd.DataFrame(data=d)

低效的循环实现(反模式)

df["col4"] = 0 # 初始化列
for i in range(0, df.shape[0]):
    df.loc[i, "col4"] = df.loc[i, df["col3"][i]]

高效解决方案

方案1:使用df.lookup(代码简洁,旧版本Pandas可用)

lookup是Pandas专门用于按行列索引提取值的向量化方法,效率远高于循环:

df['col4'] = df.lookup(df.index, df['col3'])

注意:Pandas 1.2.0及以上版本中lookup已被标记为弃用,但仍可使用;若追求长期兼容性,推荐方案2。

方案2:使用numpy.take_along_axis(无版本限制,高性能)

通过将列名转换为列索引,结合numpy向量化操作提取值,无版本兼容问题:

import numpy as np

# 获取col3中列名对应的列索引位置
col_indices = df.columns.get_indexer(df['col3'])
# 提取对应位置的值并转为一维数组
df['col4'] = np.take_along_axis(df.values, col_indices[:, np.newaxis], axis=1).flatten()

方案3:使用apply(代码简洁,效率优于循环)

若追求代码简洁性,可使用apply逐行处理,效率比手动循环高:

df['col4'] = df.apply(lambda row: row[row['col3']], axis=1)

效果验证

上述方案最终生成的DataFrame均为:

col1col2col3col4
13col11
24col24
11col11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:30:53