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

如何在Pandas/Numpy中批量将存储列名的DataFrame列映射到目标DataFrame列值并生成Numpy数组

解决方法:用映射或向量化操作批量生成目标数组

嘿,这个需求完全不用逐个写loc来处理,用Pandas的内置方法就能轻松实现批量映射,效率还更高!下面给你两种实用的方案:

方案一:用map结合字典映射(灵活适配各种场景)

首先我们先构造示例数据,方便你对照测试:

import pandas as pd
import numpy as np

# 存储列名的DataFrame
df1 = pd.DataFrame({'col_names': ['var1', 'var3', 'var2']})

# 原始数据DataFrame
df2 = pd.DataFrame({
    'var1': [5, 9, 1],
    'var2': [8, 3, 4],
    'var3': [9, 2, 7]
})

核心思路是把df2的列转成「列名: 列值列表」的字典,再用map把df1里的每个列名对应到对应的列表:

# 第一步:把df2转成列名到列值列表的字典
col_dict = df2.to_dict('list')

# 第二步:用map映射每个列名到对应的列表,再转成numpy数组
result_array = np.array(df1['col_names'].map(col_dict).tolist())

运行后得到的结果正好是你想要的:

array([[5, 9, 1],
       [9, 2, 7],
       [8, 3, 4]])

为什么这个方法好用?

  • 完全是向量化操作,比循环或逐个loc高效得多,尤其适合大量变量的场景
  • 如果df1里存在df2没有的列名,还可以加默认值处理,比如:
    # 不存在的列名返回空列表
    result_array = np.array(df1['col_names'].map(lambda x: col_dict.get(x, [])).tolist())
    

方案二:按列名筛选后转置(更简洁的极简方案)

如果能保证df1里的所有列名在df2中都存在,还可以用更简洁的写法:

# 按df1的列名顺序取出df2的列,然后转置(行变列),最后转成numpy数组
result_array = df2.loc[:, df1['col_names']].values.T

这个方法直接通过列索引筛选出需要的列,然后转置,就能得到每行对应一个列的所有值的数组,结果和方案一完全一致。

两种方法都能完美替代你原来的逐个loc操作,根据你的实际场景选就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:07:42