首页 > 解决方案 > 在有时存在数据的 3 列上合并 2 个数据框

问题描述

我正在尝试从另一个数据框中合并并填充一个数据框中的缺失值。希望这不是一个太长的解释,我只是在这个问题上绞尽脑汁太久了。我正在处理 2 个巨大的 CSV 文件,所以我在这里做了一个小例子。我在最后包含了整个代码,以防您想提供帮助。非常感谢您。开始了!

print(df1)
   A   B   C   D   E
0  1  B1      D1  E1
1         C1  D1  E1
2  1  B1      D1  E1
3  2  B2      D2  E2
4     B2  C2  D2  E2
5  3          D3  E3
6  3  B3  C3  D3  E3
7  4      C4  D4  E4

print(df2)

   A   B   C   F   G
0  1      C1  F1  G1
1     B2  C2  F2  G2
2  3  B3      F3  G3
3  4  B4  C4  F4  G4

我基本上想通过 3 个不同的列将 df2 合并到 df1 中。我知道您可以合并多个列名,但它似乎没有给我想要的结果。我想保留 df1 中的所有数据,并填写 df2 中的数据,所以我使用 how='left'。

我对 python 还很陌生,已经做了很多研究,但遇到了瓶颈。这是我尝试过的。

data3 = df1.merge(df2, how='left', on=['A'])

print(data3)

   A B_x C_x   D   E  B_y  C_y    F    G
0  1  B1      D1  E1        C1   F1   G1
1         C1  D1  E1   B2   C2   F2   G2
2  1  B1      D1  E1        C1   F1   G1
3  2  B2      D2  E2  NaN  NaN  NaN  NaN
4     B2  C2  D2  E2   B2   C2   F2   G2
5  3          D3  E3   B3        F3   G3
6  3  B3  C3  D3  E3   B3        F3   G3
7  4      C4  D4  E4   B4   C4   F4   G4

正如您在此处看到的,它只适用于 A,但是因为这是一个带有空白值的 csv 文件。空白值似乎合并在一起。我不想要。因为 df2 在第 2 行是空白的,所以它填写了它看到空白的数据,这不是我想要的。如果找不到匹配项,它应该是 NaN。

每当我开始在我的 "on=['A', 'B'] 中添加其他行时,它并没有做任何不同的事情。事实上,A 不再合并。

data3 = df1.merge(df2, how='left', on=['A', 'B'])
print(data3)

   A   B C_x   D   E  C_y    F    G
0  1  B1      D1  E1  NaN  NaN  NaN
1         C1  D1  E1  NaN  NaN  NaN
2  1  B1      D1  E1  NaN  NaN  NaN
3  2  B2      D2  E2  NaN  NaN  NaN
4     B2  C2  D2  E2   C2   F2   G2
5  3          D3  E3  NaN  NaN  NaN
6  3  B3  C3  D3  E3        F3   G3
7  4      C4  D4  E4  NaN  NaN  NaN

A、B 和 C 行是我想要关联和合并的值。使用这两个数据框,它应该知道足以填补所有空白。我的结尾 df 应该是这样的:

print(desired_output):

   A   B   C   D   E   F   G
0  1  B1  C1  D1  E1  F1  G1
1  1  B1  C1  D1  E1  F1  G1
2  1  B1  C1  D1  E1  F1  G1
3  2  B2  C2  D2  E2  F2  G2
4  2  B2  C2  D2  E2  F2  G2
5  3  B3  C3  D3  E3  F3  G3
6  3  B3  C3  D3  E3  F3  G3
7  4  B4  C4  D4  E4  F4  G4

即使 A、B 和 C 有重复的行,我也想保留所有数据,只需在可能适合的地方填写 df2 中的数据,即使它是重复数据。我也不想让所有的 _x 和 _y 后缀合并。我知道如何重命名,但是进行 3 次不同的合并并合并这些合并开始变得非常复杂,非常快,重复的行和后缀...

长话短说,我如何将两个数据帧按 A、B、C 合并?它发生的顺序无关紧要。

这是实际数据的示例。我有自己的数据,其中包含其他数据,我通过某些标识符将其与这些数据相关联。基本上是通过 MMSI、名称和 IMO。我想保留重复,因为它们实际上并不是重复的,只是每艘船的附加数据点

MMSI         BaseDateTime          LAT        LON       VesselName      IMO CallSign
366940480.0  2017-01-04T11:39:36  52.48730 -174.02316    EARLY DAWN     7821130  WDB7319
366940480.0  2017-01-04T13:51:07  52.41575 -174.60041    EARLY DAWN     7821130  WDB7319
273898000.0  2017-01-06T16:55:33  63.83668 -174.41172  MYS CHUPROVA         NaN     UAEZ
352844000.0  2017-01-31T22:51:31  51.89778 -176.59334         JACHA  8512920    3EFC4
352844000.0  2017-01-31T23:06:31  51.89795 -176.59333         JACHA  8512920    3EFC4

标签: excelpython-3.xpandasdataframemerge

解决方案


推荐阅读