首页 > 解决方案 > Pandas:基于一个公共列组合两个不同形状的数据框

问题描述

我有一个df列:

Student_id      subject       marks
1               English       70
1               math          90
1               science       60
1               social        80
2               English       90
2               math          50
2               science       70
2               social        40

我有另一个df1

Student_id      Year_of_join   column_with_info
1                2020           some_info1
1                2020           some_info2
1                2020           some_info3
2                2019           some_info4
2                2019           some_info5

我想组合上述两个数据框(.csv 文件),如下所示res_df

Student_id      subject       marks  year_of_join   column_with_info
1               English       70     2020            some_info1
1               math          90     2020            some_info2
1               science       60     2020            some_info3
1               social        80     NaN              NaN
2               English       90     2019            some_info4
2               math          50     2019            some_info5
2               science       70     NaN              NaN
2               social        40     NaN              NaN

注意: 我想加入基于Student_ids 的数据集。两者都具有相同的唯一 Student_id,但两个数据集的数据形状不同。

PS:生成的 dfres_df只是组合两个数据帧后数据可能看起来如何的一个示例,它也可以是这样的:

Student_id      subject       marks  year_of_join   column_with_info
1               English       70     NaN               NaN
1               math          90     2020           some_info1
1               science       60     2020           some_info2
1               social        80     2020           some_info3
2               English       90     NaN               NaN
2               math          50     NaN               NaN
2               science       70     2019            some_info4
2               social        40     2019            some_info5

在此先感谢您的帮助!请帮我解决这个问题..

标签: pythonpython-3.xpandasdataframe

解决方案


用于GroupBy.cumcount与左连接合并的辅助列:

df['g'] = df.groupby('Student_id').cumcount()
df1['g'] = df1.groupby('Student_id').cumcount()

df = df.merge(df1, on=['Student_id','g'], how='left').drop('g', axis=1)

推荐阅读