【发布时间】:2019-11-18 10:47:01
【问题描述】:
我正在尝试使用 pandas 读取一个相当大的 CSV(2 GB)来进行一些数据类型操作并与我之前已经加载的其他数据帧连接。因为我想对记忆有点小心,所以我决定分块阅读。出于问题的目的,这里是我的带有虚拟数据的 CSV 布局的摘录(不能真正分享真实数据,抱歉!):
institution_id,person_id,first_name,last_name,confidence,institution_name
1141414141,4141414141,JOHN,SMITH,0.7,TEMP PLACE TOWN
10123131114,4141414141,JOHN,SMITH,0.7,TEMP PLACE CITY
1003131313188,4141414141,JOHN,SMITH,0.7,"TEMP PLACE,TOWN"
18613131314,1473131313,JOHN,SMITH,0.7,OTHER TEMP PLACE
192213131313152,1234242383,JANE,SMITH,0.7,"OTHER TEMP INC, LLC"
我读取文件的 pandas 代码:
inst_map = pd.read_csv("data/hugefile.csv",
engine="python",
chunksize=1000000,
index_col=False)
print("processing institution chunks")
chunk_list = [] # append each chunk df here
for chunk in inst_map:
# perform data filtering
chunk['person_id'] = chunk['person_id'].progress_apply(zip_check)
chunk['institution_id'] = chunk['institution_id'].progress_apply(zip_check)
# Once the data filtering is done, append the chunk to list
chunk_list.append(chunk)
ins_processed = pd.concat(chunk_list)
我正在应用的zip check 函数基本上是执行一些数据类型检查,然后将它得到的值转换为整数。
每当我读取 CSV 时,它只会读取 institution_id 列并生成索引。 CSV 中的其他列只是静默删除。
当我不使用 index_col=False 作为选项时,它只会将 1141414141/4141414141/JOHN/SMITH/0.7(基本上是行中的前 5 个值)设置为索引,并且仅将 institution_id 作为标题,同时仅将 institution_name 读取到数据框作为一个值。
老实说,我不知道这里发生了什么,经过 2 小时的 SO / google 搜索后,我决定只问这个问题。希望有人能帮帮我,谢谢!
【问题讨论】:
-
我无法重现您的问题。
-
我好像也有类似的问题。当我只是将数据的一个子集复制到一个新文件中时,不会出现问题,这让我相信它是 csv 的格式问题。您是否碰巧知道什么格式错误会导致 pandas 以我上面描述的方式读取 csv?
-
尝试将块大小设置为更小,可能为 10。另外,在你的 for 循环中添加一个枚举器,如果在几个循环后停止。然后看看你是否遇到同样的问题。如果不继续增加停止点,直到您重现错误。这至少会缩小文件中问题所在的范围。
-
似乎即使我只使用 10 的块大小,整个数据帧也会像描述的那样中断。我怀疑 CSV 文件本身一定有问题。奇怪的是,无论我使用什么其他工具(CSViewer),它都能正常工作。只有熊猫给我带来了问题。我想我将不得不对文件本身进行更多调查。
-
更新:感谢@James!问题是在将大型 CSV 文件传输到我的远程处理服务器(有足够的 RAM 可以在内存编辑中处理)时出现问题。在我的本地计算机上处理这些块似乎有效。我想我将不得不重新上传更大的文件或尝试不同的处理方法。
标签: python pandas csv dataframe