跳过read_csv中缺少值的行
问题内容:
我有一个非常大的csv,需要读入。为了快速完成并节省RAM使用量,我正在使用read_csv并将某些列的dtype设置为np.uint32。问题在于某些行缺少值,而熊猫使用浮点数来表示这些值。
- 是否可以简单地跳过缺少值的行?我知道在读取整个文件后可以执行此操作,但这意味着直到那时我都无法设置dtype,因此会占用过多的RAM。
- 是否可以将缺失值转换为我在读取数据期间选择的其他值?
问题答案:
这将是精致的,如果你能填NaN
有发言权0
期间读取本身。也许Pandas的git-hub中有一个功能请求是为了…
使用转换器功能
但是,暂时,您可以定义自己的函数来执行此操作并将其传递给以下converters
参数read_csv
:
def conv(val):
if val == np.nan:
return 0 # or whatever else you want to represent your NaN with
return val
df = pd.read_csv(file, converters={colWithNaN : conv}, dtypes=...)
请注意,这converters
需要一个dict
,因此您需要为每个要处理NaN的列指定一个。如果影响许多色谱柱,可能会有些累。您可以指定列名称或数字作为键。
另请注意,这可能会降低read_csv
性能,具体取决于converters
函数的处理方式。此外,如果只有一列需要在读取过程中处理NaN,则可以跳过适当的函数定义,而使用lambda
函数:
df = pd.read_csv(file, converters={colWithNaN : lambda x: 0 if x == np.nan else x}, dtypes=...)
分块阅读
您还可以将文件拼接成小块阅读,以获取最终输出。您可以通过这种方式做很多事情。这是一个说明性的示例:
result = pd.DataFrame()
df = pd.read_csv(file, chunksize=1000)
for chunk in df:
chunk.dropna(axis=0, inplace=True) # Dropping all rows with any NaN value
chunk[colToConvert] = chunk[colToConvert].astype(np.uint32)
result = result.append(chunk)
del df, chunk
请注意,此方法并不严格复制数据。有一段时间,数据在语句chunk
后紧接着存在两次result.append
,但只chunksize
重复行,这是一个合理的交易。此方法也可能比使用转换器功能更快。