【发布时间】: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”集