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

如何使用指定DataFrame作为列引用从另一DataFrame提取值生成新表

实现方法(Pandas环境)

方法1:逐行匹配(逻辑直观,适合小数据量)

首先构造和你场景一致的测试数据:

import pandas as pd
import numpy as np

# 构造DF A
df_a = pd.DataFrame({
    'L': [1, 4, 7],
    'M': [2, 5, 8],
    'N': [3, 6, 9]
})

# 构造DF B
df_b = pd.DataFrame({
    'X': ['L', 'M', 'N'],
    'Y': [np.nan, 'N', 'L']
})

核心逻辑是按行索引匹配,从A中取对应列的值:

def fetch_val(row_idx, col_name):
    # 列名为空直接返回NaN,否则取A对应行对应列的值
    if pd.isna(col_name):
        return np.nan
    return df_a.loc[row_idx, col_name]

# 逐行处理B生成结果
df_result = df_b.apply(
    lambda row: pd.Series([fetch_val(row.name, row['X']), fetch_val(row.name, row['Y'])]),
    axis=1
)

输出结果和你预期完全一致:

0    1
0  1.0  NaN
1  5.0  6.0
2  9.0  7.0

如果需要自定义结果列名,直接赋值即可:df_result.columns = ['自定义列1', '自定义列2']


方法2:向量化操作(无循环,适合10万行以上的大数据量场景)

逐行apply在数据量大的时候性能较差,用表关联的向量化操作效率会高很多:

# 将B转为长表,保留空值
df_b_long = df_b.stack(dropna=False).reset_index(name='ref_col')
# 将A转为长表,方便匹配
df_a_long = df_a.stack().reset_index().rename(columns={'level_1':'ref_col', 0:'value'})
# 按行索引和列名关联取值
df_merged = df_b_long.merge(df_a_long, on=['level_0', 'ref_col'], how='left')
# 转回宽表得到最终结果
df_result = df_merged.set_index(['level_0', 'level_1'])['value'].unstack()

该方法不需要修改逻辑即可支持B有更多提取列的场景,扩展性更强。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:54:04