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

