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

Python实现同ID配偶行转列并指定列求和方案问询

同ID下配偶与户主合并行并求和的实现方案

问题背景

现有数千行数据,配偶信息单独成一行但与户主共享相同ID,部分ID对应数十行数据。需求为:当ID匹配时,将配偶行转为列合并到户主行,同时对指定数值列求和。

输入数据示例:

ID  Position  Title  First  Last  SpTitle  SpFirst  SpLast  Address    Value1  Value2  Value3
0  456 HoH       Mr.    John   Doe   NaN      NaN      NaN     123 street  10      NaN     30
1  456 Spouse    Mrs.   Jane   Doe   NaN      NaN      NaN     123 street  10      NaN     30
2  789 HoH       Mrs.   Jane   Doe   NaN      NaN      NaN     456 road    100     200     300
3  789 HoH       Mrs.   Jane   Doe   NaN      NaN      NaN     456 road    400     500     600
4  789 Spouse    Mr.    John   Doe   NaN      NaN      NaN     456 road    NaN     10      30

期望输出示例:

ID  Position  Title  First  Last  SpTitle  SpFirst  SpLast  Address    Value1  Value2  Value3
0  456 HoH       Mr.    John   Doe   Mrs.     Jane     Doe     123 street  20      NaN     60
1  789 HoH       Mrs.   Jane   Doe   Mr.      John     Doe     456 road    500     710     930

解决方案思路

核心逻辑是拆分户主与配偶数据后按ID合并,再通过分组聚合完成数值求和与信息合并,规避原代码中transform导致的重复计算问题:

  • 拆分户主(HoH)和配偶(Spouse)两个子集
  • 重命名配偶的个人信息列为专属字段,避免合并时列冲突
  • 按ID将配偶数据合并到户主数据中
  • 对同一ID下的户主多行数据,保留唯一基础信息,同时对数值列求和

修正后的代码

import pandas as pd
import numpy as np

# 读取并合并所有工作表
df = pd.concat(pd.read_excel("C:/Users/Sheet.xlsx", sheet_name=None), ignore_index=True)

# 过滤空ID行
df = df[df['ID'].notna()]

# 1. 拆分户主和配偶数据
hoh_df = df[df['Position'] == 'HoH'].copy()
spouse_df = df[df['Position'] == 'Spouse'].copy()

# 2. 重命名配偶的个人信息列为配偶专属字段
spouse_rename_map = {
    'Title': 'SpTitle',
    'First Name': 'SpFirstName',
    'Middle Name': 'SpMiddleName',
    'Last Name': 'SpLastName',
    'Date of Birth': 'SpBirthDate',
    'Gender': 'SpGender'
}
spouse_df = spouse_df.rename(columns=spouse_rename_map)

# 只保留配偶的ID和专属字段,避免合并时列冲突
spouse_df = spouse_df[['ID'] + list(spouse_rename_map.values())]

# 3. 按ID合并户主和配偶数据
merged_df = pd.merge(hoh_df, spouse_df, on='ID', how='left')

# 4. 定义聚合规则:个人信息取第一个有效值,数值列求和
agg_rules = {
    # 户主基础信息
    'Position': 'first',
    'Title': 'first',
    'First Name': 'first',
    'Middle Name': 'first',
    'Last Name': 'first',
    'Address': 'first',
    # 配偶信息
    'SpTitle': 'first',
    'SpFirstName': 'first',
    'SpMiddleName': 'first',
    'SpLastName': 'first',
    'SpBirthDate': 'first',
    'SpGender': 'first',
    # 需要求和的数值列
    'Value 2019': np.sum,
    'Value 2020': np.sum,
    'Value 2021': np.sum,
    'Value 2022': np.sum,
    'Fund 2019': np.sum,
    'Fund 2020': np.sum,
    'Fund 2021': np.sum,
    'Fund 2022': np.sum
}

# 按ID分组聚合,得到最终结果
final_df = merged_df.groupby('ID', as_index=False).agg(agg_rules)

# 导出结果
final_df.to_csv("C:/Users/data.csv", index=False)

代码说明

  • 拆分数据后逻辑更清晰,避免原代码中transform导致的重复赋值问题
  • 配偶列重命名后合并,确保字段不冲突
  • 聚合规则明确区分个人信息(取唯一有效值)和数值列(求和),完全匹配需求
  • 处理效率更高,适配数千行的数据集规模

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:01:01