如何使用指定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
相关产品推荐
相关产品推荐

