pandas读取大规模数据(2g以上不适合直接read)

读取2g以上数据适用,暂未探索其上限。——读取完记得考虑第二步的处理。

(4g内存1.6g大小csv文件就会出问题;8g内存2.6g大小就会出问题。其底层机制未明……)

1、读取

import pandas as pd

reader = pd.read_csv('hlj_all_addr.csv', iterator=True)

loop = True

chunkSize = 100000

chunks = []

while loop:

try:

chunk = reader.get_chunk(chunkSize)

chunks.append(chunk)

except StopIteration:

loop = False

print ("Iteration is stopped.")

pd1 = pd.concat(chunks, ignore_index=True)

2、变量类型

读取完毕在运行程序时,可能会报错。

这是因为分批读取时候,同一个变量,前一批的变量类型和后一批的变量类型不一致导致的。

可使用下面代码统一类型后解决。

pd1["plate_no"]=pd1["plate_no"].apply(str)

# 迭代器返回的值类型不统一,需要转换格式,否则后续str.contains报错

# 该数据为门牌号,想找特定字符的门牌号,有的被识别为数字,有的则是字符串,使用str.contains会报错

报错代码粘贴如下:

---------------------------------------------------------------------------

ValueError Traceback (most recent call last)

in

2

3 tmp=pd1[pd1['plate_no'].notnull()]

----> 4 tmp=pd1[pd1["plate_no"].str.contains(pat='-',regex=False)]

5 tmp.to_csv('tmp1.csv',encoding='gbk')

D:\programs\anaconda\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)

2788

2789 # Do we have a (boolean) 1d indexer?

-> 2790 if com.is_bool_indexer(key):

2791 return self._getitem_bool_array(key)

2792

D:\programs\anaconda\lib\site-packages\pandas\core\common.py in is_bool_indexer(key)

134 if not lib.is_bool_array(key):

135 if isna(key).any():

--> 136 raise ValueError(na_msg)

137 return False

138 return True

ValueError: cannot mask with array containing NA / NaN values

3、进一步考虑

大于32g数据的读取处理