让我们假设一个非常简单的数据结构。在以下示例中,ID是唯一的。 “ date”和“ id”是字符串,“ amount”是整数。
data = [[date1, id1, amount1], [date2, id2, amount2], etc.]
如果
date1 == date2
和id1 == 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扩展和经过优化的例程构建的,这些例程使其非常易于转换和操作。