【问题标题】:Iterating through and comparing two Pandas Dataframes遍历和比较两个 Pandas 数据框
【发布时间】:2021-07-08 17:17:26
【问题描述】:

我一直在做一个小项目来筛选备份作业报告,并且正在使用几个 Pandas Datafram 来尝试完成这项工作。现在,我知道手动迭代数据框并不理想 - 但考虑到我想要实现的目标,我不确定是否有更好的方法。总的来说,我对 Python 和 Pandas 也很陌生。

所以我有一个备份作业列表,由它们的备份类型、系统名称和系统类型唯一定义。此列表存储在 objects_df 中。

接下来,我列出了每个作业运行及其成功或失败状态的列表。这存储在 report_df 中,有几千行。

一旦连续 3 次失败,我想在 report_df 中“标记”一个作业。我只关心第一次发生这种情况时“标记”。

这是我试图用来实现这一切的丑陋代码:

for index, row in objects_df.iterrows():
    count = 0
    for index2, row in report_df.iterrows():
        if(objects_df['Task Type'][index].equals(report_df['Task Type'][index2]) and objects_df['Object Name'][index].equals(report_df['Object Name'][index2]) and objects_df['Object Type'][index].equals(report_df['Object Type'][index2])):
            if(row['Task Status'] == "Succeeded" and count < 3):
                count = 0
            if(row['Task Status'] == "Failed"):
                count += 1
            if(count == 3):
                report_df.at[index2, 'flag'] = True
                break

如您所见,它会遍历我的对象列表,并且对于在报告中找到的每个匹配项,它都会开始计算失败次数。一旦达到 3 次连续失败,它就会在 report_df 中对其进行标记。

不幸的是,这段代码给我带来了各种各样的问题,而且似乎并没有真正将预期的行标记为“flag = true”。相反,我得到重复的行和成功运行的标志被标记为“真”。

有没有办法清理这段代码,或者有更好的方法来处理这个项目?即使我确实让这项工作正常进行,恐怕要花很长时间才能遍历所有数据。

谢谢!

【问题讨论】:

  • 欢迎堆栈溢出!查看输入数据帧的样本和预期输出将有助于我们更好地了解您的任务以及如何提供帮助,请参阅How to make good pandas examples
  • 为什么不将“备份类型、系统名称和系统类型”组合成一个“id”,并用它来计算像 len(df[df["id"] == "bkX -sysX-systX"]) 用于您可以使用 df["id"].unique() 获得的“id”集

标签: python pandas


【解决方案1】:

你调查过Dataframe.compare:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.compare.html

我认为您的任务最容易分为两个步骤:

  1. 比较两个数据帧
  2. 为 3 个或更多不相等比较的实例处理生成的数据帧

第二步是一个不同的问题。类似问题:https://stackoverflow.com/a/41488980/9190640

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多