读取2g以上数据适用,暂未探索其上限。——读取完记得考虑第二步的处理。
(4g内存1.6g大小csv文件就会出问题;8g内存2.6g大小就会出问题。其底层机制未明……)
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)
读取完毕在运行程序时,可能会报错。
这是因为分批读取时候,同一个变量,前一批的变量类型和后一批的变量类型不一致导致的。
可使用下面代码统一类型后解决。
pd1["plate_no"]=pd1["plate_no"].apply(str)
# 迭代器返回的值类型不统一,需要转换格式,否则后续str.contains报错
# 该数据为门牌号,想找特定字符的门牌号,有的被识别为数字,有的则是字符串,使用str.contains会报错
报错代码粘贴如下:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-9a108c6ca670> in <module>
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
大于32g数据的读取处理