Python + pandas + chunksize 如何分块 分组 再汇总统计?

2017-08-10 15:28:43 +08:00
 bccber
有一个很大的文件 内容是一行一个 MD5 值 我需要统计每个 MD5 出现的次数
如果直接 pandas.read_csv 会 MemoryError
一行一行读+字典 也行 但不是我要的

怎么使用 分块读取 然后分组统计再汇总?
loop = True
chunkSize = 100000
chunks = []

while loop:
try:
chunk = data.get_chunk(chunkSize)
chunks.append(chunk)
except StopIteration:
loop = False
print("Iteration is stopped.")

df = pd.concat(chunks, ignore_index=True)
5502 次点击
所在节点    Python
8 条回复
ferstar
2017-08-10 16:03:15 +08:00
刚好手上有个类似的数据集,唯一与楼主不同的是每一行是一个[100, 150]的整数,我是这样统计的:
---
```python
from collections import Counter

import pandas as pd

size = 2 ** 10
counter = Counter()
for chunk in pd.read_csv('file.csv', header=None, chunksize=size):
counter.update([i[0] for i in chunk.values])

print(counter)

```
---
大概输出如下:
```
Counter({100: 41,
101: 40,
102: 40,
...
150: 35})
```
caomaocao
2017-08-10 16:33:30 +08:00
Counter() 或者 Mapreduce 的思想做哦~
chuanqirenwu
2017-08-10 19:18:38 +08:00
dask 一行搞定。

dd.groupby().count(),和 pandas 一样的 API,但是把 fill in memory 拓展到 fill in disk。
zhusimaji
2017-08-10 19:22:59 +08:00
Counter 可以试试,有分布式观景首选 mapreduce
zhusimaji
2017-08-10 19:24:08 +08:00
分布式环境
zhusimaji
2017-08-10 19:33:11 +08:00
@chuanqirenwu 学习新姿势,一般数据量大都是实用 spark 完成计算,刚去看了下 dask,不错的包
liprais
2017-08-10 19:43:35 +08:00
sort | uniq -c
notsobad
2017-08-10 19:44:57 +08:00
用 shell 比较简单

cat x.txt | sort | uniq -c

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/381935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX