【问题标题】:Breaking from Pandas read_csv when condition met while using chunks在使用块时满足条件时打破 Pandas read_csv
【发布时间】:2019-07-14 10:56:07
【问题描述】:

我正在使用 Pandas 读取文本文件并使用 read_csv 修剪数据。我想通过在满足某个字符串值时停止 csv_read 来加速程序,但是在处理块时我似乎无法做到这一点。我的数据遵循这样的常规模式:

v 2298995.721525 14888281.709655 4538.717779 0.015686 0.035294 0.019608
v 2298996.930769 14888284.103022 4538.596748 0.023529 0.031373 0.027451
v 2299001.331951 14888295.376948 4538.696330 0.027451 0.043137 0.031373
... (about 4.5 million lines of this)

f 155739//155739 157296//157296 156114//156114
f 157296//157296 160780//160780 156113//156113
f 159990//159990 157296//157296 155739//155739
... (about 10 million lines of this)

我可以读取和输出数据,但是如果我在 read_csv 检测到第一列中的“f”字符串时停止它会节省大量的处理时间。这是我当前的代码:

import pandas as pd
import sys

#assign names to columns
colnames = ['ID', 'X', 'Y', 'Z']

#assign chunk size
c_size=200000

#read input file with space separated columns, strip header, and strip extra columns
for obj_chunk in pd.read_csv(sys.argv[1],sep='\s+', header=3, usecols=[0,1,2,3],chunksize=c_size, ):
    dtype={'ID':str,'X':int, 'Y':int, 'Z':int}
    obj_chunk.columns = colnames
    obj_chunk = obj_chunk[~obj_chunk.ID.str.contains('f')]
    obj_chunk.to_csv(sys.argv[2], index=False, header=None, columns = ['X','Y','Z'], mode = 'a')

我尝试了一些“if”然后“break”语句,但我认为我没有走在正确的轨道上:

if obj_chunk[obj_chunk.ID.str.contains('f').any]: break

感谢您的帮助!

【问题讨论】:

  • 我试过你的说法,但我不断收到 KeyErrors: True or False 取决于我使用的字符串表达式。我可能没有把它放在正确的位置?谢谢!

标签: python pandas python-2.7 csv


【解决方案1】:

一个想法:如果块数据帧的所有行都保存了,这意味着我们在第一列中也没有'f',这意味着某些行已被抑制并且行数小于块的大小(或其文件结尾)所以, 我将在循环内测试行数:

#assign chunk size
c_size=200000

for obj_chunk in pd.read_csv(sys.argv[1],sep='\s+', header=3, usecols= [0,1,2,3],chunksize=c_size, ):
    dtype={'ID':str,'X':int, 'Y':int, 'Z':int}
    obj_chunk.columns = colnames
    obj_chunk = obj_chunk[~obj_chunk.ID.str.contains('f')]
    obj_chunk.to_csv(sys.argv[2], index=False, header=None, columns = ['X','Y','Z'], mode = 'a')
    #test nbr of lines
    if obj_chunk['ID'].count() < c_size:
        break

【讨论】:

  • 这似乎成功了,谢谢!您的添加将我的处理时间减少了 24%,所以我认为这是值得的!
猜你喜欢
  • 2010-11-06
  • 2020-04-21
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2018-04-03
  • 2021-12-14
  • 2018-06-17
相关资源
最近更新 更多