仅追加尚未在pandas Dataframe 中的行

ia2d9nvy  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(476)

我有相同的数据集,但在不同的星期(所以后面的星期包含新的行)。我想将新的行附加到原始的dataframe,以创建一个大的dataframe,其中所有的行都是唯一的,没有重复。我不能只取最后一周,因为有些行会在几周内被删除。
我尝试使用下面的代码,但我的final_info数据框仍然包含一些非唯一值

final_info = data[list(data.keys())[-1]]['all_info']
    for week in reversed(data.keys()):
    df_diff = pd.concat([data[week]['all_info'],final_info]).drop_duplicates(subset='project_slug', 
                                                                             keep=False)
    final_info = final_info.append(df_diff).reset_index(drop=True)

有没有人看到哪里出错了?

j7dteeu8

j7dteeu81#

如果我理解了你的问题,你只是想从一个 Dataframe 添加唯一的行到另一个 Dataframe 。我不认为有任何需要迭代通过键像你这样做。有一个例子在这个问题上,我认为可以帮助你,我认为这是概念上更容易遵循1。我会尝试通过一个例子来使它更清楚。
如果你有一个dataframe A:

col1  col2
1     2
2     3
3     4

以及 Dataframe B:

col1  col2
1     2
2     3
6     4

这两个 Dataframe 的前两行相同,但最后一行不同。如果您想将所有唯一行放入一个 Dataframe 中,则可以首先从其中一个 Dataframe 中获取所有唯一行。因此,对于此示例,您可以获取 Dataframe B中的唯一行,在此示例中将其称为df_diff。执行此操作的代码为

df_diff = B[~B.col1.isin(A.col1)]

output: col1  col2
        6     4

上面这行代码创建了一个布尔掩码,然后使用~求反,这样你就可以得到数据框B中col 1值不在数据框A中的所有行。
然后,你可以将这个数据框df_diff与第一个数据框A合并。我们可以称之为df_full。这一步是这样完成的:

df_full = pd.concat([A, df_diff], ignore_index=True)

ignore_index=True只是重置结果 Dataframe 的索引。这将给予你:

col1  col2
1     2
2     3
3     4
6     4

现在,上面的数据框具有数据框B中的新行加上来自数据框A的原始行。
我认为这将适用于您的情况,并且可能会减少代码行。

7xllpg7q

7xllpg7q2#

还有一个方法pandas.DataFrame.combine_first,它可以同时执行多个操作:

  • 如果包含空值的第一 Dataframe 行不包含空值,则用来自第二 Dataframe 的相同行更新包含空值的第一 Dataframe 行
  • 将新行附加到第一个 Dataframe

语法:df_1.combine_first(df_2)
参考:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.combine_first.html

相关问题