如何在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
相关产品推荐
相关产品推荐

