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

基于另一DataFrame多列匹配实现DataFrame关联并生成指定结果

解决DataFrame匹配与扩展需求的实现方案

核心思路

  1. 先将dataframe2转换为长格式,把level1、level2、level3列的取值统一放到一列中,关联对应的level1值,方便后续和dataframe1匹配
  2. 拆分dataframe1为两部分处理:
    • 非"All"行:和转换后的dataframe2匹配,获取对应的level1作为newcolumn
    • "All"行:和dataframe2的所有唯一level1做笛卡尔积,保留原value和column2
  3. 合并两部分结果,得到最终的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:35:32