pandas 合并两个具有同一键的多行数据框

hpcdzsge  于 2023-01-11  发布在  其他
关注(0)|答案(2)|浏览(121)

我将医疗数据拆分为两个不同的CSV,需要将它们合并。一个数据集包含基本的人口统计信息,第二个数据集包含诊断代码。每个患者都被分配了一个名为INC_KEY的唯一标识号,我将其简化为简单的数字,如下例所示:
DF1:

INC_KEY   SEX    AGE
1         F      40
2         F      24  
3         M      66

DF2:

INC_KEY   DCODE
1         BW241ZZ
1         BW28ZZZ
2         0BH17EZ
3         05H633Z
2         4A103BD
3         BR30ZZZ   
1         BF42ZZZ

我需要合并两个 Dataframe ,输出包含三行,如df1所示,每个dcode对应于该患者的附加列。如下所示:

INC_KEY   SEX    AGE   DCODE1     DCODE2     DCODE3
1         F      40    BW241ZZ    BW28ZZZ    BF42ZZZ
2         F      24    0BH17EZ    4A103BD    N/A
3         M      66    05H633Z    BR30ZZZ    N/A

我该怎么做呢?我试着做了一个左合并,但它没有给出我想要的结果。

taor4pac

taor4pac1#

您可以使用.mergeINC_KEY列上的两个 Dataframe 合并。然后,您可以使用.groupby()pd.concat()将各个行转换为所需的列。最后,您可以使用.drop()删除原始"DCODE"列:

df = df1.merge(df2, on="INC_KEY", how="right")
df = df.groupby(["INC_KEY", "SEX", "AGE"]).agg({"DCODE": list}).reset_index()
df = pd.concat(
    (df, pd.DataFrame(df["DCODE"].values.tolist()).add_prefix("DCODE")), 
    axis=1
)
df = df.drop("DCODE", axis=1)

这将输出:

INC_KEY SEX  AGE   DCODE0   DCODE1   DCODE2
0        1   F   40  BW241ZZ  BW28ZZZ  BF42ZZZ
1        2   F   24  0BH17EZ  4A103BD     None
2        3   M   66  05H633Z  BR30ZZZ     None
ee7vknir

ee7vknir2#

这里有另一种方法:

df_out = df1.merge(df2, on='INC_KEY')
df_out = df_out.set_index(['INC_KEY', 'SEX', 'AGE', df_out.groupby('INC_KEY').cumcount()]).unstack()
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out.reset_index()

输出:

INC_KEY SEX  AGE   DCODE0   DCODE1   DCODE2
0        1   F   40  BW241ZZ  BW28ZZZ  BF42ZZZ
1        2   F   24  0BH17EZ  4A103BD      NaN
2        3   M   66  05H633Z  BR30ZZZ      NaN

相关问题