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)
<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

3、进一步考虑

大于32g数据的读取处理

你可能感兴趣的:(技术基础,python,数据分析,数据建模)