基于关联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.
相关产品推荐
相关产品推荐

