如何基于键值从另一DataFrame匹配MODE值并填充目标DataFrame
问题分析
你之前的pd.merge失败是因为仅通过Area-ID匹配,而每个Area-ID在df1中对应多个不同Series的MODE值,无法直接对应到df2的900/1800/2100列。Excel的VLOOKUP本质是用Area-ID+Series的复合键匹配,Python里需要复刻这个逻辑。
解决方案
以下两种方法均适合大数据量场景,高效实现需求:
方法一:透视df1后合并(推荐,性能更优)
先把df1转成与df2结构匹配的宽表,再合并填充:
# 1. 从Area-ID-Series字段拆分出Series值(若df1无单独Series列) # 假设Area-ID-Series格式为"AreaID-900"这类,用'-'分隔 df1['Series'] = df1['Area-ID-Series'].str.split('-').str[-1] # 2. 将df1按Area-ID分组,把Series转成列,填充MODE值,缺失值设为'-' df1_pivot = df1.pivot( index='Area-ID', columns='Series', values='MODE' ).fillna('-') # 3. 确保列名与df2一致(比如df2的列是字符串'900'还是数字900,统一格式) df1_pivot.columns = df1_pivot.columns.astype(str) # 4. 和df2合并,用Area-ID匹配,保留df2原有结构 df_result = df2.merge(df1_pivot, on='Area-ID', how='left') # 若df2原有列有值,想保留原有值、仅填充空值,用combine_first: # df_result = df2.set_index('Area-ID').combine_first(df1_pivot).reset_index()
方法二:用复合键字典逐列映射
如果需要更灵活的控制,可创建复合键映射逐列填充:
# 1. 创建(Area-ID, Series)到MODE的映射字典 # 若df1无单独Series列,先拆分: df1['Series'] = df1['Area-ID-Series'].str.split('-').str[-1] mode_map = df1.set_index(['Area-ID', 'Series'])['MODE'].to_dict() # 2. 遍历df2的Series列,逐个填充 for col in ['900', '1800', '2100']: # 列名根据实际情况调整类型 df2[col] = df2.apply( lambda row: mode_map.get((row['Area-ID'], col), '-'), axis=1 )
内容的提问来源于stack exchange,提问作者Algo Rithm
相关产品推荐
相关产品推荐

