基于另一DataFrame多列匹配实现DataFrame关联并生成指定结果
解决DataFrame匹配与扩展需求的实现方案
核心思路
- 先将
dataframe2转换为长格式,把level1、level2、level3列的取值统一放到一列中,关联对应的level1值,方便后续和dataframe1匹配 - 拆分
dataframe1为两部分处理:- 非"All"行:和转换后的
dataframe2匹配,获取对应的level1作为newcolumn - "All"行:和
dataframe2的所有唯一level1做笛卡尔积,保留原value和column2
- 非"All"行:和转换后的
- 合并两部分结果,得到最终的
Finaldataframe
代码实现(基于Pandas)
先构造示例数据用于验证:
import pandas as pd # 构造dataframe1 dataframe1 = pd.DataFrame({ 'column1': ['A', 'B', 'All', 'C'], 'column2': ['X', 'Y', 'Z', 'X'], 'value': [10, 20, 30, 40] }) # 构造dataframe2 dataframe2 = pd.DataFrame({ 'level1': ['L1', 'L1', 'L2', 'L3'], 'level2': ['A', 'D', 'B', 'C'], 'level3': ['E', 'F', 'G', 'All'] })
执行处理逻辑:
# 1. 将dataframe2转为长格式,生成匹配映射表 df2_melt = dataframe2.melt( id_vars=['level1'], value_vars=['level2', 'level3'], value_name='match_val' )[['level1', 'match_val']] # 2. 处理非"All"的行 non_all_df = dataframe1[dataframe1['column1'] != 'All'].merge( df2_melt, left_on='column1', right_on='match_val', how='left' ).rename(columns={'level1': 'newcolumn'}).drop('match_val', axis=1) # 3. 处理"All"的行 all_df = dataframe1[dataframe1['column1'] == 'All'].merge( dataframe2[['level1']].drop_duplicates(), how='cross' ).rename(columns={'level1': 'newcolumn'}).drop('column1', axis=1) # 4. 合并结果得到Finaldataframe final_dataframe = pd.concat([non_all_df, all_df], ignore_index=True)
结果说明
- 非"All"行:比如
column1为"A"的行,会匹配到dataframe2中level2或level3等于"A"的对应level1(示例中是"L1") - "All"行:原行的
column2为"Z"、value为30,会和dataframe2的所有唯一level1(L1、L2、L3)分别组合,生成3行数据 - 若需要保留原
column1字段,可调整合并时的字段删除逻辑
内容的提问来源于stack exchange,提问作者dummy
相关产品推荐
相关产品推荐

