0

我有df1:

    trip_id                                     latitude    longitude   datetime
0   356a192b7913b04c54574d18c28d46e6395428ab    57.723610   11.925191   2021-06-13 14:22:11.682
1   356a192b7913b04c54574d18c28d46e6395428ab    57.723614   11.925187   2021-06-13 14:22:13.562
2   356a192b7913b04c54574d18c28d46e6395428ab    57.723610   11.925172   2021-06-13 14:22:28.635
3   da4b9237bacccdf19c0760cab7aec4a8359010b0    57.723637   11.925056   2021-06-13 14:22:59.336
4   da4b9237bacccdf19c0760cab7aec4a8359010b0    57.724075   11.923708   2021-06-13 14:23:44.905
5   77de68daecd823babbb58edb1c8e14d7106e83bb    57.723610   11.925191   2021-06-13 14:22:04.000
6   77de68daecd823babbb58edb1c8e14d7106e83bb    57.723614   11.925178   2021-06-13 14:22:44.170
7   77de68daecd823babbb58edb1c8e14d7106e83bb    57.723827   11.924635   2021-06-13 14:23:14.479
8   77de68daecd823babbb58edb1c8e14d7106e83bb    57.723866   11.924005   2021-06-13 14:23:29.605

和df2:

    trip_id                                     latitude    longitude   datetime
0   356a192b7913b04c54574d18c28d46e6395428ab    47.723610   14.925187   2021-06-13 14:22:59.336
1   555a192b7913b04c54574d18c28d46e639542yyy    60.723610   12.925187   2021-06-13 14:22:59.336
2   77de68daecd823babbb58edb1c8e14d7106e83cc    58.993066   13.924005   2022-06-13 20:23:29.605


我想检查 df1 中是否存在 df2 中的行。为此,我尝试了:

df2.isin(df1)

>>

 trip_id  latitude  longitude   datetime
0   True    False   False   False
1   False   False   False   False
2   False   False   False   False


最终目标是将 df2 中的观察(行)添加到 df1(如果它们不存在)。但是,由于在trip_id 中为索引0 返回True,所以df2 的整个第一行不会在df1 中被标识为新行。只要观测值中有一个元素不同,就应该在 df1 中将其添加为新行。

要将 df2 中的新行添加到 df1,我将使用:

df3 = df1.append(df2, ignore_index=True)

所以最终,最终的代码应该是:

if df2.isin(df1):
   df3 = df1.append(df2, ignore_index=True)

4

2 回答 2

1

您可以简单地append根据drop_duplicates您的需要:

df1.append(df2).drop_duplicates()
于 2021-07-13T18:16:34.717 回答
1

您的示例数据有点混乱,您想拒绝重复df2,但df1已经有重复(按trip_id);例如,前 3 行df1具有相同的trip_id. 所以目标有点不明确。

此外,您期望的构造:

if df2.isin(df1):
   df3 = df1.append(df2, ignore_index=True)

是错的。如您的示例所示pd.DataFrame.isin,将返回布尔数据框,并且未定义 pandas/numpy 数组的真值。你会得到这个错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

所以按照这个描述:

只要观测值中有一个元素不同,就应该在 df1 中将其添加为新行。

我建议如下:

df1.append(df2[~df1.isin(df2).all(axis=1)])

但是,如果您多次这样做,我建议您将代码重构为执行以下操作:

updates = [df2[...], df3[...], ..., dfn[...]]
result = pd.concat([df1, *updates]], axis=0)
于 2021-07-13T18:47:45.627 回答