Pandas:合并后的DataFrame过长

5

假设我有两个数据框,其中一个比另一个长,我想在特定列上将它们连接起来,就像以下示例:

A = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10], 'col3': [11, 12, 13, 14, 15]})

B = pd.DataFrame({'col1': [1, 3, 5], 'col2': [16, 17, 18], 'col4': [19, 20, 21]})

然后我使用以下方法将它们组合起来:

pd.merge(A, B, on='col1', how='outer')

并如预期地获得:

       col1     col2_x  col3    col2_y  col4
0       1       6       11      16      19
1       2       7       12      NaN     NaN
2       3       8       13      17      20
3       4       9       14      NaN     NaN
4       5       10      15      18      21

5 rows × 5 columns

然而,我有两个数据框需要合并,分别有28,011行和15,676行。按照上述方法合并它们,我希望得到一个具有28,011行的数据框,并在df2中没有观察值的单元格中获得NaN。但实际上发生的是:

len(pd.merge(df1, df2, on='col1', how='outer'))
  51881

这怎么可能呢?我要合并的列是唯一标识符,在Stata中进行相同的操作没有问题。我在这里漏掉了什么?


3
你好像希望使用 how='left'?这样的外连接会包含 df2 中所有在 df1 中找不到匹配的观测值。还有,请确认一下 col1 列中是否存在重复值。 - chrisb
如果你在包含NaN的键上进行合并,可能会得到意想不到的行数。 - BSalita
1个回答

3
听起来你需要进行左连接。
尝试使用以下语句:
pd.merge(df1, df2, left_on='col1',right_on='col1',how='left')

我也这样想,但是,唉,不行:len(pd.merge(df1, df2, left_on='col1', right_on='col1', how='left'))给出的结果是51881,len(pd.merge(df1, df2, left_on='col1', right_on='col1', how='inner'))则是46249。似乎没有选项可以将较小的数据框合并到较大的数据框中,同时保留较大的数据框长度。 - Nils Gudat
1
我犯了个错误,我要合并的那一列实际上包含了一些重复的值,所以为了确切地识别,我需要在两列上进行合并。最后通过使用pd.merge(df1, df2, on=['col1','col2'], how='left')成功解决了问题! - Nils Gudat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接