如何从另一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
相关产品推荐
相关产品推荐

