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

如何在Python中按vid分组并将不同Gender的行合并为单行

问题描述

现有如下Pandas DataFrame:

import pandas as pd

df = pd.DataFrame.from_dict(
    {
        'vid':['v1','v1','v1','v1','v1','v2','v2','v2','v2'],
        'Name': ['Jenny', 'Matt', 'Jenny', 'Jenny',  'Matt', 'Jenny',  'Matt', 'Jenny', 'Matt'],
        'Year': [2020, 2021,2022, 2022, 2020, 2021, 2022, 2020, 2021],
        'Income': [10000, 11000,90001, 9000, 12000, 13000, 11000, 14000, 15000],
        'Gender': ['F', 'M', 'F', 'M','F', 'M', 'F', 'M', 'F']
    }
)
print(df)

运行后输出:

vid   Name  Year  Income Gender
0  v1  Jenny  2020   10000      F
1  v1   Matt  2021   11000      M
2  v1  Jenny  2022   90001      F
3  v1  Jenny  2022    9000      M
4  v1   Matt  2020   12000      F
5  v2  Jenny  2021   13000      M
6  v2   Matt  2022   11000      F
7  v2  Jenny  2020   14000      M
8  v2   Matt  2021   15000      F

需要按vid分组,同时依据Gender将两行合并为单行(允许列数增加),预期输出如下:

vid   Name  Year  Income Gender   vid_1  Name_1 Year_1 Income_1 Gender_1
  v1  Jenny  2020   10000      F      v1   Matt  2021   11000      M
  v1  Jenny  2022   90001      F      v1  Jenny  2022    9000      M
  v1   Matt  2020   12000      F      NA   NA     NA     NA        NA
  v2  Jenny  2021   13000      M      v2   Matt  2022   11000      F
  v2  Jenny  2020   14000      M      v2   Matt  2021   15000      F
实现方法

可以通过以下步骤实现需求:

  • 按vid分组,给每组内的行添加配对组号和组内位置标识,用于区分需要合并的两行
  • 将数据拆分为两部分,分别对应原始列和带_1后缀的列
  • 横向合并两部分数据,空值替换为NA

具体代码如下:

import pandas as pd

# 原始数据
df = pd.DataFrame.from_dict(
    {
        'vid':['v1','v1','v1','v1','v1','v2','v2','v2','v2'],
        'Name': ['Jenny', 'Matt', 'Jenny', 'Jenny',  'Matt', 'Jenny',  'Matt', 'Jenny', 'Matt'],
        'Year': [2020, 2021,2022, 2022, 2020, 2021, 2022, 2020, 2021],
        'Income': [10000, 11000,90001, 9000, 12000, 13000, 11000, 14000, 15000],
        'Gender': ['F', 'M', 'F', 'M','F', 'M', 'F', 'M', 'F']
    }
)

# 添加配对组号和组内位置
df['pair_id'] = df.groupby('vid').cumcount() // 2
df['pos'] = df.groupby('vid').cumcount() % 2

# 拆分数据为两部分
df_original = df[df['pos'] == 0].drop(columns=['pair_id', 'pos']).reset_index(drop=True)
df_paired = df[df['pos'] == 1].drop(columns=['pair_id', 'pos']).reset_index(drop=True)
df_paired.columns = [f'{col}_1' for col in df_paired.columns]

# 合并并替换空值
result = pd.concat([df_original, df_paired], axis=1).fillna('NA')

print(result)

如果需要严格按Gender配对(比如每个F对应一个M),可以先在组内按Gender排序后再添加编号:

# 先按vid和Gender排序,确保同组内F和M交替出现
df_sorted = df.sort_values(['vid', 'Gender']).reset_index(drop=True)
# 后续添加pair_id和pos的逻辑不变
df_sorted['pair_id'] = df_sorted.groupby('vid').cumcount() // 2
df_sorted['pos'] = df_sorted.groupby('vid').cumcount() % 2
# 拆分合并步骤同上

内容的提问来源于stack exchange,提问作者Yuvaraj V C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:56:05