我有一个包含320k行和450列的小数据帧。有些列表带有列号:
list1 = [1,3,5,...]
list2 = [4,9,...]
...
我的目标是替换当前列表中每个列中的某些值,然后保存它:
^{pr2}$数据帧的大小使我不得不分块进行:
for chunk in pd.read_csv(filePrev,chunksize=10000,header=None):
>>> chunk[chunk[list1] >= 7] = np.nan
>>> chunk[chunk[list2] >= 90] = np.nan
...
>>> chunk.to_csv(newFile,mode='a',header=False,index=False)
但是有一个不正确的工作:我已经运行了很多次这段代码,但是它大部分都无法完成工作(IPython或Windows刚刚关闭的应用程序中的内存错误),以及任何chunksize值。但当它完成时,它将大多数字符串中的所有值替换为NaN,并且在某些字符串中所有值都被正确替换。在
我在同一个数据集的一小部分上尝试了相同的逻辑,它正确地工作了!在
In [11]: df = pd.read_csv(filePrev,nrows=5,usecols=[1,2,3,4,5,6,7],header=None)
In [12]: df
Out[12]:
1 2 3 4 5 6 7
0 1 1 1 1 1 1 1
1 3 1 1 1 2 1 1
2 3 1 1 1 1 1 1
3 3 1 1 1 2 1 2
4 3 1 1 1 1 1 1
In [13]: list = [1,7]
In [14]: df[df[list] > 1] = np.nan
In [15]: df
Out[15]:
1 2 3 4 5 6 7
0 1 1 1 1 1 1 1
1 NaN 1 1 1 2 1 1
2 NaN 1 1 1 1 1 1
3 NaN 1 1 1 2 1 NaN
4 NaN 1 1 1 1 1 1
有什么想法吗?我们可以在“分块”模式下实现它吗,还是有另一种方法(我需要一个例子)?我只想将某些值替换为NaN。。。:)
可以通过保持文件打开而不是每次在追加模式下打开文件来改进这一点:
最近有人在这里报告了这种行为,这一变化使他们在Windows上a 98.3% performance gain(我在osx上只看到了大约25%)。
如果使用Profile或(ipython的)%prun运行python代码,则可以看到调用时间最多、函数调用最多的内容。在question I was referring to above的情况下,大多数时间都花在python的
close
函数中(除非文件保持打开状态,否则在每次调用pd.read_csv
之后关闭)注意:逻辑看起来没问题,您没有分配给副本。正如您在您的小示例中看到的:代码有效!在
问题在于代码处理某些列。有这样的线索:
而不是
^{pr2}$如果有N:
然后所有的行都用NaN转换成数组
感谢大家的帮助。在
相关问题 更多 >
编程相关推荐