使用Pandas查找2个不同大小的 Dataframe 之间的差异并相应地更新文件

xmakbtuz  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(125)

我有2个CSV文件,是在不同的日期创建的,我想比较,我想更新第二个基于差异的一些领域从第一。
表中的每一项都由3行组成(您可以看到Name_* 没有更改)此外,关于状态列,我们将始终具有LISTED、STARTED和PASSED/FAILED值
第二个是基本CSV,它包含所有项,第一个CSV(新CSV)可以是不同的大小(缺少一个或几个项),例如,我们缺少第四个项“Name_4”
更新成本字段的规则,我们需要有Iteration_First_CSV>Iteration_Second_CSV & Name_First_CSV==Name_Second_CSV & Status_First_CSV==['PASSED','FAILED'](我们不想更新LISTED和STARTED成本)
更新状态字段的规则,我们需要Iteration_First_CSV>Iteration_Second_CSV & Name_First_CSV==Name_Second_CSV
这是第二个CSV enter image description here
第一个CSV enter image description here
结果应如下所示enter image description here
我开始在“成本”字段更新上工作:

df_second.loc[((df_first['Name'].eq(df_second['Name']))&(df_first['Cost'].ge(df_second['Cost']))&(df_first['Status'].isin(['PASSED','FAILED']))), 'Cost'] = df_first['Cost']

但这会导致"Must have equal len keys and value when setting with an iterable"错误

rdrgkggo

rdrgkggo1#

可能最简单的方法是过滤你想要检查的行,合并,修改和“重建”数据框。如果你有很多数据,这可能不是最佳的。

df1_filtered = df1[~df1.Status.isin(["LISTED", "STARTED"])
df2_filtered = df2[~df2.Status.isin(["LISTED", "STARTED"])

columns = df2.columns.tolist()

df2_filtered = df2_filtered.merge(df1_filtered, how="left", on=["Name"], suffixes=("", "_1")

df2_filtered.loc[df2.iteration_1 > df2.iteration, "Cost"] = df2_filtered.Cost_1

df2 = pd.concat([df2[df2.Status.isin(["LISTED", "STARTED"])], df2_filtered[columns]]).sort_values(["A", "B", "Name"])

这是从我的脑海中完成的,所以可能会有一些小问题。
注:也许这是不可能的。但是看着文件,我会做的第一件事就是改变格式。它似乎有重复的信息(这是坏的多个原因)。我不知道数据集的确切细节,但从我所看到的,我只会保留:

  • a、B、名称、成本、status_passed、status_started、status_listed、日期、迭代。

status_* 列可以是布尔值。我认为这将是一个更好的结构(除非我错过了什么),这将是更容易在Pandas和

相关问题