如何基于另一列数据在Pandas中动态选列并映射值
问题描述
现有两个DataFrame:
df1:
date_time | value1 | column_value 12-Mar-22 17345 17200CE 13-Mar-22 17400 17200PE ....
df2:
date_time | value1 | 17200CE | 17200PE | 17300CE | ....... 12-Mar-22 17345 23.3 21.2 24.5 13-Mar-22 17345 24.3 22.2 22.5
需要在df1中新增一列mapped_value_result,规则是:根据df1的column_value列的值,匹配df2中对应列名,同时取同一date_time行的数据,最终得到如下结果:
date_time | value1 | column_value | mapped_value_result 12-Mar-22 17345 17200CE 23.3 13-Mar-22 17345 17200PE 22.2
解决方案
方法1:用df.lookup(适合pandas 2.0以下版本)
lookup可以直接按行索引和列名匹配取值,步骤如下:
# 把df2的date_time设为索引,方便按日期匹配 df2_indexed = df2.set_index('date_time') # 从df1中提取日期和列名,在df2中查找对应值 df1['mapped_value_result'] = df2_indexed.lookup(df1['date_time'], df1['column_value'])
注意:pandas 2.0及以上版本已弃用lookup,建议用下面的方法。
方法2:merge + melt(通用兼容版)
把df2的宽表转成窄表,再和df1合并,兼容性拉满:
# 将df2的多列转成键值对形式 df2_melted = df2.melt( id_vars=['date_time', 'value1'], var_name='column_value', value_name='mapped_value_result' ) # 按日期和column_value合并两个表 result_df = df1.merge(df2_melted, on=['date_time', 'column_value'], how='left') # 保留df1原有的value1列,删除合并带来的重复列 result_df = result_df.drop('value1_y', axis=1).rename(columns={'value1_x': 'value1'})
方法3:apply逐行匹配(适合小数据集)
逻辑简单直观,但大数据集下效率偏低:
def get_match_value(row): # 找到df2中同日期的行,取出对应列的值 match_row = df2[df2['date_time'] == row['date_time']] return match_row[row['column_value']].values[0] if not match_row.empty else None df1['mapped_value_result'] = df1.apply(get_match_value, axis=1)
内容的提问来源于stack exchange,提问作者Utkarsh Dhawan
相关产品推荐
相关产品推荐

