Python/Pandas: 替换大型数据集多列中的某些值
Python/Pandas: replacing certain values in multiple columns of large dataset
我有一个包含 320k 行和 450 列的小型数据框。有一些带有列号的列表:
list1 = [1,3,5,...]
list2 = [4,9,...]
...
我的目标是替换当前列表中每一列中的某些值,然后保存它:
df[df[list1] > 7] = np.nan
df[df[list2] >90] = np.nan
...
dataframe 的大小让我分块做:
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),具有任何块大小值。但是当它完成时,它将大多数字符串中的所有值都替换为 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
那么,有什么想法吗?是不是可以用"chunking"的方式来实现,或者有其他的方式(那我需要一个例子)?我只想将某些值替换为 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%)。
如果您 运行 您的 python 代码带有配置文件或 (ipython's) %p运行,您可以看到什么被调用的时间最长,最多的函数调用。在 的情况下,大部分时间花在 python 的 close
函数上(在每次调用 pd.read_csv
后关闭,除非您保持文件打开。)
注意:逻辑看起来没问题,您没有分配给副本。正如您在较小的示例中所见:代码有效!
问题出在处理某些列的代码中。有这样的字符串:
chunk[chunk[393] > 50] = np.nan
而不是
chunk[chunk[[393]] > 50] = np.nan
如果有N个:
chunk[393][N] > 50
然后所有行转换为 NaN 数组
感谢大家的帮助。
我有一个包含 320k 行和 450 列的小型数据框。有一些带有列号的列表:
list1 = [1,3,5,...]
list2 = [4,9,...]
...
我的目标是替换当前列表中每一列中的某些值,然后保存它:
df[df[list1] > 7] = np.nan
df[df[list2] >90] = np.nan
...
dataframe 的大小让我分块做:
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),具有任何块大小值。但是当它完成时,它将大多数字符串中的所有值都替换为 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
那么,有什么想法吗?是不是可以用"chunking"的方式来实现,或者有其他的方式(那我需要一个例子)?我只想将某些值替换为 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 上
如果您 运行 您的 python 代码带有配置文件或 (ipython's) %p运行,您可以看到什么被调用的时间最长,最多的函数调用。在 close
函数上(在每次调用 pd.read_csv
后关闭,除非您保持文件打开。)
注意:逻辑看起来没问题,您没有分配给副本。正如您在较小的示例中所见:代码有效!
问题出在处理某些列的代码中。有这样的字符串:
chunk[chunk[393] > 50] = np.nan
而不是
chunk[chunk[[393]] > 50] = np.nan
如果有N个:
chunk[393][N] > 50
然后所有行转换为 NaN 数组
感谢大家的帮助。