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

