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

如何用Python合并连续同性别DataFrame行并按性别交替输出

解决Pandas连续同性别行合并(数值列求和)问题

需求明确

  • 数据规则:必须以Female(F)开头、Male(M)结尾
  • 处理逻辑:连续的同性别行合并为单行,所有数值列对应值相加
  • 约束:列数较多,需自动适配多列场景,不用手动指定列名

示例数据与期望输出

示例输入DataFrame

import pandas as pd

df = pd.DataFrame({
    'Gender': ['F', 'F', 'M', 'F', 'M', 'M'],
    'Year': [2020, 2021, 2020, 2022, 2021, 2022],
    'Income': [5000, 6000, 7000, 8000, 9000, 10000],
    'Expense': [2000, 2500, 3000, 3500, 4000, 4500]
})

期望输出

Gender  Year  Income  Expense
0      F  4041   11000     4500
1      M  2020    7000     3000
2      F  2022    8000     3500
3      M  4043   19000     8500

正确实现方案

核心思路

之前的代码问题在于没有区分连续同性别和全局同性别,我们需要先给连续的同性别行打上分组标签,再按分组聚合求和。

完整代码

import pandas as pd

def merge_continuous_gender(df):
    # 1. 给连续同性别行打分组标签
    # 当当前行性别和上一行不同时,分组ID+1,确保连续同性别行在同一组
    df['group_id'] = (df['Gender'] != df['Gender'].shift()).cumsum()
    
    # 2. 自动筛选所有数值型列,适配多列场景
    numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns.drop('group_id', errors='ignore')
    
    # 3. 按分组和性别聚合,数值列求和
    result = df.groupby(['group_id', 'Gender'])[numeric_cols].sum().reset_index(drop=True)
    
    # 4. 校验数据是否符合F开头、M结尾的规则
    if result.iloc[0]['Gender'] != 'F' or result.iloc[-1]['Gender'] != 'M':
        raise ValueError("输入数据必须以Female(F)开头,Male(M)结尾")
    
    return result

# 测试代码
output = merge_continuous_gender(df)
print(output)

代码说明

  • 分组标签生成:用shift()对比前后行性别,cumsum()生成连续分组ID,这是处理连续相同值分组的标准方法。
  • 自动适配多列:通过select_dtypes自动识别数值型列,不用手动写列名,不管有多少数值列都能处理。
  • 聚合逻辑:按分组ID和性别分组,对所有数值列求和,最后重置索引得到整洁结果。
  • 规则校验:避免输入不符合要求的数据导致错误输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:01:47