如何在多个数据框中有效地找到相同的索引

How to efficiently find identical indices in multiple dataframes

我有一个流程可以收集整个星期生成的报告并合并收集以消除相同的报告。

我编写了一个函数,通过查找具有相同索引的报告来识别相同的报告,然后它排除除其中一个以外的所有报告并继续前进。虽然它可以很好地处理 5000-10,000 份报告,但它开始需要大量时间来处理,比如说,50,000 多份报告,随着时间的推移,这种情况会越来越普遍。

如果我能先发制人地消除报告并避免此步骤,那就太好了,但生成报告的过程不允许这样做。所以,我想找到一种方法使这个或类似的功能更有效率。

代码如下:

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_report_dict)
    keys = [k for k in sorts.keys()]
    consolidated_sorts = keys
    print('Original Report Size: ', len(consolidated_sorts))
    for k in keys:
        if k in consolidated_sorts:
            for j in keys[keys.index(k)+1:]:
                if j in consolidated_sorts:
                    if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
                        consolidated_sorts.remove(j)
    print('Consolidated Report Size: ', len(consolidated_sorts))
    consolidated_report = {}
    consolidated_val = {}
    for s in consolidated_sorts:
        consolidated_report[s] = master_report_dict[s]
        consolidated_val[s] = master_val_dict[s]
    return consolidated_report, consolidated_val

如果我错了请纠正我,但它看起来像:

consolidated_sorts = keys
print('Original Report Size: ', len(consolidated_sorts))
for k in keys:
    if k in consolidated_sorts:
        for j in keys[keys.index(k)+1:]:
            if j in consolidated_sorts:
                if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
                    consolidated_sorts.remove(j)

只是寻找独特的报告。事实上,迭代是多余的,因为您首先将 consolidated_sorts 设置为 keys,然后迭代这些值并询问它们是否在 consolidated_sorts 中,这就是它们的来源。

如果你只是想要唯一的键,你可以尝试这样的事情:

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_tree)

    # New code to create unique set of keys
    unique_keys = set(sorts.keys())

    consolidated_report = {}
    consolidated_val = {}

    for key in unique_keys:
        consolidated_report[key] = master_report_dict[key]
        consolidated_val[key] = master_val_dict[key]

    return consolidated_report, consolidated_val

我不知道我是否正确理解了你的问题,即使我理解了,我也不知道这样是否更快,但是是否可以创建一个字典,你可以在其中使用唯一的报告索引作为键(例如使用 frozenset),然后将报告键作为值。感觉这是构建唯一列表的更快方法,但我可能会离开:

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_report_dict)
    print('Original Report Size: ', len(sorts))
    unique_reports = dict()
    for report_key, report in sorts.items:
        key = frozenset(report.index)
        # Alt 1. Replace with new (identical) repoirt
        unique_reports[key] = report_key
        # Alt 2. Keep first report
        if key not in unique_reports:
            unique_reports[key] = report_key
    consolidated_sorts = unique_reports.values()
    print('Consolidated Report Size: ', len(consolidated_sorts))
    consolidated_report = {}
    consolidated_val = {}
    for s in consolidated_sorts:
        consolidated_report[s] = master_report_dict[s]
        consolidated_val[s] = master_val_dict[s]
    return consolidated_report, consolidated_val

大家可以看到,dict update也有两个选项,看你是要保留第一个找到的report还是无所谓。

插入字典应该接近 O(1),因此我认为这会相当快。