了解熊猫合并的本质



我想了解pd.merge的工作性质。我有两个长度不等的数据帧。当试图通过以下命令合并它们时

merged = pd.merge(surgical, comps[comps_ls+['mrn','Admission']], on=['mrn','Admission'], how='left')

长度与预期不同,如下所示

length of comps: 4829
length of surgical: 7939
length of merged: 9531

根据我自己的理解,merged数据帧应该与comps数据帧的长度相同,因为left连接将在两个数据帧中寻找匹配的键并丢弃其余的键。只要comps的长度小于surgical的长度,则merged的长度应为4829。为什么有9531?大于两者长度的数。即使我将how参数更改为"right",merged的数字也比预期的要大。

一般来说,我想知道如何合并两个长度不等的数据框,从正确的数据框中指定一些列。另外,如何验证合并操作?这可能会有帮助:

comps_ls: list of complications I want to throw on surgical dataframe.
mrn, Admission: the key columns I want to merge the two dataframes on.

注意:一个队友建议这个解决方案

merged = pd.merge(surgical, comps[comps_ls+['mrn','Admission']], on=['mrn','Admission'], how='left')
merged = surgical.join(merged, on=['mrn'], how='left', lsuffix="", rsuffix="_r")

输出的长度如下

length of comps: 4829
length of surgical: 7939
length of merged: 7939

这有什么用?

具有重复的合并键,这可能导致生成的合并大于原始合并。对于左合并,您可以期望结果在N_rows_leftN_rows_left * N_rows_right行之间。下界是指左右两个dataframe都没有重复的合并键,上界是指左右两个dataframe在每一行的合并键都有一个相同的值。

下面是一个工作示例。所有的dataframe都是4行长,但是df2有重复的合并键。因此,当df2合并到df时,输出比df长,因为对于df中2作为键的行,df2中的行匹配。

import pandas as pd
df = pd.DataFrame({'key': [1,2,3,4]})
df1 = pd.DataFrame({'row': range(4), 'key': [2,3,4,5]})
df2 = pd.DataFrame({'row': range(4), 'key': [2,2,3,3]})
# Neither frame duplicated on merge key, result is same length (4) as left. 
df.merge(df1, on='key', how='left')
#   key  row
#0    1  NaN
#1    2  0.0
#2    3  1.0
#3    4  2.0

# df2 is duplicated on the merge keys so we get >4 rows 
df.merge(df2, on='key', how='left')
#   key  row
#0    1  NaN
#1    2  0.0    # Both `2` rows matched
#2    2  1.0    # ^
#3    3  2.0    # Both `3` rows matched
#4    3  3.0    # ^
#5    4  NaN

如果合并的数据框的长度大于左数据框的长度,则表示右数据框对于相同的连接键有多个条目。例如,如果您有这些数据帧:

df1
---
id      product
0   111     car
1   222     bike
df2
---
id      color
0   111     blue
1   222     red
3   222     green
3   333     yellow

合并将呈现3行,因为有两个可能的df1行与id222匹配。

df1.merge(df2, on="id", how="left")
---
id      product  color
0   111     car      blue
1   222     bike     red
2   222     bike     green

最新更新