1

我有一个非常大的数据文件需要解析。我编写了一些组函数并使用字典,我能够得到我的小数据集。

但是,更大的数据集不起作用。这是我的数据集在 csv 文件中的样子:

123.0001, 'axis a', 'axis b', 'axis c'
123.0002, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0009, 'axis a', 'axis b', 'axis c'

该文件约为 20 GB。我想使用熊猫加载这个文件并按时间分组。123.0001 是纪元时间,有数百个。但是,它们不是线性的。也就是说,他们可能会跳过几秒钟。同一秒内可能还会记录一些不同的事件。甚至是微秒。

假设我想将它们分组为 1 分钟的间隔,并计算设定间隔中有多少。

我将如何使用熊猫来做到这一点?

请注意,我已经使用标准字典和列表在没有熊猫的情况下进行了这项工作。但是,为大型数据集生成结果大约需要 3 个小时。

如果您有更好的解决方案,请告诉我。

4

2 回答 2

1

用 读入文件df = read_csv(filename, header=None)。然后使用类似的东西将第一列转换为时间戳...

nanoseconds = (10e9*df[0]).astype('int')
df[0] = nanoseconds.apply(pd.Timestamp)

我假设您的纪元时间以秒为单位并将它们转换为纳秒。

然后使用 pandas 的 groupby 和/或 resample 功能来做任何你想做的事情。

请参阅我对您的问题的评论中的链接,了解相关问题和有关即将进行的改进的信息,这些改进将使这变得不那么尴尬。

于 2013-06-10T21:15:32.910 回答
0

由于 CSV 文件相当大,您可能需要分块读取它。您可以通过 groupby/count 操作减少每个块的大小,然后连接(减少的)块。由于生成的 DataFrame 可能具有具有相同索引的行(由于来自不同块的行具有相同的timestamp//60),我们现在需要执行 groupby/sum 操作来组合具有相同索引的行的计数:

import pandas as pd
# Choose chunksize to be a large but manageable number of lines
chunksize = 10**5
chunks = pd.read_csv(filename, chunksize=chunksize, header=None)
freqs = pd.concat(chunk.groupby(chunk[0]//60).count() for chunk in chunks)
freqs = freqs.groupby(freqs.index).sum()

在一个 1.3GB 的文件上,上面的代码在我的机器上运行了大约 150 秒。所以处理一个 20GB 的文件应该不到一个小时。

于 2013-06-11T00:37:06.913 回答