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

时间:2017-06-27 17:54:43

标签: python list dictionary dataframe symmetric-difference

我有一个流程,用于收集整周生成的报告,并整合收集以消除相同的报告。

我编写了一个函数,通过查找具有相同索引的那些来识别相同的报告,然后它排除了除了其中一个相同并继续前进之外的所有报告。虽然它适用于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

2 个答案:

答案 0 :(得分:1)

我不知道我是否正确理解你的问题,即使我这样做,我也不知道这是否更快,但是不可能创建一个dict,你可以使用唯一的报告索引作为键(例如使用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更新中还有两个选项,这取决于您是要保留第一个找到的报告还是无关紧要。

插入dict应该接近O(1)因此我会想象这很快。

答案 1 :(得分:0)

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

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