跳过read_csv中缺少值的行


问题内容

我有一个非常大的csv,需要读入。为了快速完成并节省RAM使用量,我正在使用read_csv并将某些列的dtype设置为np.uint32。问题在于某些行缺少值,而熊猫使用浮点数来表示这些值。

  1. 是否可以简单地跳过缺少值的行?我知道在读取整个文件后可以执行此操作,但这意味着直到那时我都无法设置dtype,因此会占用过多的RAM。
  2. 是否可以将缺失值转换为我在读取数据期间选择的其他值?

问题答案:

这将是精致的,如果你能填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重复行,这是一个合理的交易。此方法也可能比使用转换器功能更快。