让我们假设一个非常简单的数据结构。在以下示例中,ID是唯一的。 “ date”和“ id”是字符串,“ amount”是整数。

data = [[date1, id1, amount1], [date2, id2, amount2], etc.]


如果date1 == date2id1 == id2,我想将两个条目合并为一个,并基本上将amount1和amount2加起来,以便数据变为:

data = [[date1, id1, amount1 + amount2], etc.]


有很多重复项。

由于数据量很大(超过100,000个条目),我想尽可能高效地做到这一点。我所做的是创建了一个新的“ common”字段,该字段基本上将date + id组合为一个带有元数据的字符串,允许我稍后对其进行拆分(date + id + "_" + str(len(date))。

就复杂性而言,我有四个循环:


从外部源解析和加载数据(它不在列表中)上)
遍历数据并创建和存储“公共”字符串(日期+ ID +元数据)-我称其为“准备好的数据”,其中“公共”是我的编码字段|上)
使用Counter()对象对“准备好的数据”进行重复数据删除|上)
解码“普通” |上)


我不在乎内存,我只在乎速度。我可以做一个嵌套循环,避免执行步骤2、3和4,但这会造成时间复杂性灾难(O(n²))。

最快的方法是什么?

最佳答案

使用pandas使这变得非常容易:

import pandas as pd
df = pd.DataFrame(data, columns=['date', 'id', 'amount'])
df.groupby(['date','id']).sum().reset_index()


要进行更多控制,可以使用agg代替sum()

df.groupby(['date','id']).agg({'amount':'sum'})


取决于您对数据的处理方式,这样做可能更容易/更快捷,因为很多熊猫都是基于编译的C扩展和经过优化的例程构建的,这些例程使其非常易于转换和操作。

09-26 22:10
查看更多