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']))
这段代码片段将所有组存储在一个字典中,并在读取整个文件后计算错误率。
组的组合过多会出现内存不足的异常
我在写这篇文章时尝试使用 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时对应的记录为异常记录)
您没有说明您的预期聚合是什么,但如果它是
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']))
这段代码片段将所有组存储在一个字典中,并在读取整个文件后计算错误率。
组的组合过多会出现内存不足的异常