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

如何从另一DataFrame向现有DataFrame匹配插入指定值?

向主DataFrame插入子集数据,非匹配项合并至Other列

需求说明

需要将subset DataFrame中的数据匹配插入到main DataFrame的对应列;如果subset中的数据没有对应的列名,则将这些值累加到main的Other列中,同时更新Total列(示例中Total为In列值的2倍)。

示例数据

import pandas as pd

# 主数据
main_data = pd.DataFrame({
    'J-1': ['2001', '2002', '2003', '2004'],
    'X': [3225, 4602, 9412, None],
    'Y': [6875, 7557, 175, None],
    'Z': [0, 97, 0, None],
    'A': [163, 0, 3259, None],
    'Other': [468, 410, 500, None],
    'In': [10731, 12666, 13346, None],
    'Total': [18495.34643, 19086.79928, 20187.56618, None]
})

# 子集数据(修正千分位逗号为纯数值)
subset_data = pd.DataFrame({
    '1st': ['X'],
    'Winner': [9751],
    'Winner %': ['75%'],
    '2nd': ['av'],
    '2nd P': ['Z'],
    '2nd Score': [2760],
    '2nd %': ['21%'],
    'Margin': [6991],
    'Margin%': ['54%'],
    '3rd': ['uv'],
    '3rd P': ['S'],
    '3rd Score': [304],
    '3rd %': ['2%'],
    'Others Score': [174],
    'Others %': ['1%'],
    'In': [12989]
})

期望输出

J-1      X     Y     Z     A  Other     In       Total
0  2001   3225  6875     0   163    468  10731  18495.34643
1  2002   4602  7557    97     0    410  12666  19086.79928
2  2003   9412   175     0  3259    500  13346  20187.56618
3  2004   9751     0  2760     0    478  12989  25978.00000

问题分析

原尝试代码仅处理了列名完全匹配的情况,但subset中的数据是通过1st、2nd P等字段关联到main的列名,且需要将非匹配的得分项合并到Other,因此需要针对性处理这些映射关系。

解决方案代码

# 定位要更新的目标行(J-1=2004)
target_idx = main_data[main_data['J-1'] == '2004'].index[0]

# 1. 处理直接匹配的列:In
main_data.loc[target_idx, 'In'] = subset_data['In'].iloc[0]

# 2. 处理映射匹配的列:1st对应X,2nd P对应Z
main_data.loc[target_idx, subset_data['1st'].iloc[0]] = subset_data['Winner'].iloc[0]
main_data.loc[target_idx, subset_data['2nd P'].iloc[0]] = subset_data['2nd Score'].iloc[0]

# 3. 处理非匹配的得分项:3rd Score + Others Score,累加到Other列
other_total = subset_data['3rd Score'].iloc[0] + subset_data['Others Score'].iloc[0]
main_data.loc[target_idx, 'Other'] = (main_data.loc[target_idx, 'Other'] or 0) + other_total

# 4. 处理未匹配的列(Y、A)设为0
main_data.loc[target_idx, ['Y', 'A']] = 0

# 5. 计算Total列(按示例为In的2倍)
main_data.loc[target_idx, 'Total'] = main_data.loc[target_idx, 'In'] * 2

# 查看结果
print(main_data)

代码说明

  • 先定位需要更新的目标行索引,确保只修改2004年的数据。
  • 直接匹配的列(如In)直接赋值。
  • 通过1st、2nd P字段找到main中对应的列,将Winner、2nd Score的值插入。
  • 将3rd Score和Others Score的和累加到Other列,处理原值为None的情况。
  • 未在subset中出现的列(Y、A)设为0,符合示例输出。
  • 根据示例规律计算Total列(若实际规则不同,可调整计算逻辑)。

内容的提问来源于stack exchange,提问作者user22694852

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:33