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

如何在Pandas中提取另一列指定列名对应的值?

高效提取Pandas中按指定列名匹配的值(替代低效的iterrows)

先明确下我们的场景:
我们有这样一个DataFrame:

import pandas as pd

df = pd.DataFrame({
    'person': ['Alice', 'Bob'],
    'apple': [11, 14],
    'orange': [23, 20],
    'type': ['apple', 'orange']
})

原始数据输出:

person  apple  orange    type
0  Alice     11      23   apple
1    Bob     14      20  orange

我们需要根据每行的type列值,提取对应列(比如Alice的type是apple,就取apple列的11;Bob的type是orange,就取orange列的20),生成new_col,最终得到:

person  new_col
0  Alice       11
1    Bob       20

你提到用iterrows效率低,这点完全没错——逐行遍历是Pandas里性能最差的操作之一,尤其是数据量上去之后,速度会慢到难以接受。下面给你几个高效的向量化实现方法:

方法1:用df.lookup()(简洁但注意版本兼容)

Pandas专门提供了lookup方法来处理这种“按行和列匹配取值”的场景,代码非常简洁:

df['new_col'] = df.lookup(df.index, df['type'])

不过要注意:Pandas 1.2.0版本之后,lookup被标记为弃用(虽然目前大部分版本还能正常运行),如果你的Pandas版本比较新,更推荐下面的方法。

方法2:Numpy向量化索引(性能最优,兼容所有新版本)

利用Numpy的索引能力直接定位目标值,这是处理这类问题速度最快的方式,完全没有循环:

import numpy as np

# 先获取每个type值对应的列索引位置
col_positions = df.columns.get_indexer(df['type'])
# 按行索引和列索引提取对应的值
df['new_col'] = df.values[np.arange(len(df)), col_positions]

这个方法是纯向量化操作,处理大数据集时,速度会比iterrows快几十甚至上百倍。

方法3:melt+合并(适合复杂多列场景)

如果你的DataFrame有很多类似apple、orange的列,或者需要后续对这些列做更多处理,可以先把宽表转成窄表,再合并回去:

# 将apple和orange列转成行,保留person作为标识列
melted_df = df.melt(
    id_vars='person',
    value_vars=['apple', 'orange'],
    var_name='type',
    value_name='new_col'
)
# 合并回原表的person和type列,得到结果
result_df = df[['person', 'type']].merge(melted_df, on=['person', 'type'])

这个方法可读性很强,适合列数较多的场景,性能也远优于iterrows。

总结一下:如果追求极致性能,优先选方法2;如果喜欢简洁代码且用的是旧版Pandas,用方法1;复杂多列场景选方法3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:24:50