Python/Pandas:替换大型数据集多列中的某些值

Python/Pandas:替换大型数据集多列中的某些值,python,pandas,replace,dataframe,nan,Python,Pandas,Replace,Dataframe,Nan,我有一个包含320k行和450列的小数据框。有一些列编号为的列表: list1 = [1,3,5,...] list2 = [4,9,...] ... 我的目标是替换当前列表中每列中的某些值,然后保存它: df[df[list1] > 7] = np.nan df[df[list2] >90] = np.nan ... 数据帧的大小使我能够按块进行操作: for chunk in pd.read_csv(filePrev,chunksize=10000,header=None):

我有一个包含320k行和450列的小数据框。有一些列编号为的列表:

list1 = [1,3,5,...]
list2 = [4,9,...]
...
我的目标是替换当前列表中每列中的某些值,然后保存它:

df[df[list1] > 7] = np.nan
df[df[list2] >90] = np.nan
...
数据帧的大小使我能够按块进行操作:

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)
但有一个不正确的工作:我已经运行了很多次这段代码,但它几乎无法完成任何chunksize值的工作(IPython中的内存错误或Windows刚刚关闭的应用程序)。但当它完成时,它将大多数字符串中的所有值替换为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…:)

保持文件打开,而不是每次以追加模式打开文件,这可能会有所改善:

with open(newFile, 'a') as f:
    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(f, header=False, index=False)
最近有人在这里报告了这种行为,这一变化给了他们在Windows上的机会(我在osx上只看到了大约25%)


如果使用Profile或(ipython的)%prun运行python代码,则可以看到调用次数最多、函数调用最多的内容。在的情况下,大部分时间花在python的
close
函数上(在每次调用
pd.read\u csv
后关闭,除非您保持文件打开)



注意:逻辑看起来正常,您没有分配给副本。正如您在较小的示例中所看到的:代码工作正常

问题在于代码处理某些列。有这样的条件:

chunk[chunk[393] > 50] = np.nan
而不是

chunk[chunk[[393]] > 50] = np.nan
如果存在N:

块[393][N]>50

然后将所有行转换为带有NaN的数组



感谢大家的帮助。

这可能是因为您选择数据的方式会返回一个副本。尝试使用select