Pandas 从内存中读取 csv

Pandas read csv out of memory

我在写这篇文章时尝试使用 Pandas 来操作一个大型 CSV 文件

df = pd.read_csv(strFileName,sep='\t',delimiter='\t')

它提高了"pandas.parser.CParserError: Error tokenizing data. C error: out of memory" wc -l 表示有 13822117 行,我需要在这个 csv 文件数据帧上聚合,有没有办法处理这个,然后将 csv 分成几个文件并编写代码来合并结果?关于如何做到这一点的任何建议?谢谢

输入是这样的:

columns=[ka,kb_1,kb_2,timeofEvent,timeInterval]
0:'3M' '2345' '2345' '2014-10-5',3000
1:'3M' '2958' '2152' '2015-3-22',5000
2:'GE' '2183' '2183' '2012-12-31',515
3:'3M' '2958' '2958' '2015-3-10',395
4:'GE' '2183' '2285' '2015-4-19',1925
5:'GE' '2598' '2598' '2015-3-17',1915

所需的输出是这样的:

columns=[ka,kb,errorNum,errorRate,totalNum of records]
'3M','2345',0,0%,1
'3M','2958',1,50%,2
'GE','2183',1,50%,2
'GE','2598',0,0%,1

如果数据集很小,可以使用下面的代码,由另一个人提供

df2 = df.groupby(['ka','kb_1'])['isError'].agg({ 'errorNum':  'sum',
                                             'recordNum': 'count' })

df2['errorRate'] = df2['errorNum'] / df2['recordNum']

ka kb_1  recordNum  errorNum  errorRate

3M 2345          1         0        0.0
   2958          2         1        0.5
GE 2183          2         1        0.5
   2598          1         0        0.0

(错误记录的定义:当kb_1!=kb_2时对应的记录为异常记录)

您没有说明您的预期聚合是什么,但如果它是 , then you could aggregate in chunks:

dfs = pd.DataFrame()
reader = pd.read_table(strFileName, chunksize=16*1024)  # choose as appropriate
for chunk in reader:
    temp = chunk.agg(...)  # your logic here
    dfs.append(temp)
df = dfs.agg(...)  # redo your logic here

如果您需要求和或计数,@chrisaycock 建议的是首选方法

如果需要求平均,那是行不通的,因为avg(a,b,c,d)不等于avg(avg(a,b),avg(c,d))

我建议使用类似 map-reduce 的方法,使用流

创建一个名为 map-col.py

的文件
import sys
for line in sys.stdin:
   print (line.split('\t')[col])

还有一个名为 reduce-avg.py

的文件
import sys
s=0
n=0
for line in sys.stdin:
   s=s+float(line)
   n=n+1
print (s/n)

为了 运行 整个事情:

cat strFileName|python map-col.py|python reduce-avg.py>output.txt

无论文件大小,此方法都有效,并且不会运行内存不足

根据您在 中的代码段, 逐行阅读时。

我假设kb_2是错误指标,

groups={}
with open("data/petaJoined.csv", "r") as large_file:
    for line in large_file:
        arr=line.split('\t')
        #assuming this structure: ka,kb_1,kb_2,timeofEvent,timeInterval
        k=arr[0]+','+arr[1]
        if not (k in groups.keys())
            groups[k]={'record_count':0, 'error_sum': 0}
        groups[k]['record_count']=groups[k]['record_count']+1
        groups[k]['error_sum']=groups[k]['error_sum']+float(arr[2])
for k,v in groups.items:
    print ('{group}: {error_rate}'.format(group=k,error_rate=v['error_sum']/v['record_count']))

这段代码片段将所有组存储在一个字典中,并在读取整个文件后计算错误率。

组的组合过多会出现内存不足的异常