我想了解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_left
和N_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