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

基于关联DataFrame列值高效提取目标DataFrame指定列的数值

基于关联DataFrame列值高效提取目标DataFrame指定列的数值

嗨,我来帮你搞定这个高效提取数据的问题!针对大数据量的场景,咱们得避开那些慢腾腾的循环操作,用Pandas和NumPy的原生矢量化方法来实现,速度快还省内存。

首先先把你的示例数据放出来,方便对照:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [94, 170, 5],
                   'b': [31, 115, 8]}, index=[11, 12, 13])
df1 = pd.DataFrame({'idx': ["a", "b", "a"]}, index=[11, 12, 13])

推荐方法1:NumPy高级索引(最高效,优先选择)

这种方法直接操作底层的NumPy数组,完全矢量化,没有任何隐式循环,处理大规模数据时速度和内存效率都是最优的:

# 把列名映射为对应的列索引(a对应第0列,b对应第1列)
col_map = {'a': 0, 'b': 1}
# 获取每行需要提取的列索引数组
col_indices = df1['idx'].map(col_map).values
# 生成行索引数组(从0到行数-1)
row_indices = np.arange(len(df))
# 直接从df的底层数组中提取对应位置的值
result_values = df.values[row_indices, col_indices]
# 可以转成带索引的Series,方便后续处理
result_series = pd.Series(result_values, index=df.index, name='extracted_value')

print(result_series)

输出结果:

11     94
12    115
13      5
Name: extracted_value, dtype: int64

方法2:使用Pandas的lookup方法(兼容旧版本,已标记为deprecated)

如果你的Pandas版本还支持lookup方法(1.2.0之前的版本,或者部分新版本仍可使用),这个方法也是矢量化的,代码更简洁:

result_values = df.lookup(df.index, df1['idx'])
result_series = pd.Series(result_values, index=df.index, name='extracted_value')

⚠️ 注意:lookup在Pandas 1.2.0及以上版本中被标记为废弃(deprecated),未来可能会被移除,所以更推荐第一种NumPy的方法。

千万避开的低效方法

不要用apply逐行处理,比如:

# 不推荐!大数据量时速度极慢
bad_result = df.apply(lambda row: row[df1.loc[row.name, 'idx']], axis=1)

这种方法本质是逐行循环,当数据量很大时,速度会比矢量化方法慢几十甚至上百倍,完全不适合你的大数据场景。

总结一下:优先选择NumPy高级索引的方法,既高效又稳定,能轻松应对大规模数据集的处理需求。

备注:内容来源于stack exchange,提问作者Honza S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:39:31