在read_csv中跳过缺少值的行

时间:2016-08-07 21:12:56

标签: python pandas

我有一个非常大的csv,我需要读入。为了快速并节省RAM使用率,我使用read_csv并将某些列的dtype设置为np.uint32。问题是某些行缺少值,而pandas使用float来表示这些值。

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

3 个答案:

答案 0 :(得分:8)

如果您在阅读过程中填写NaN并说0,那将会很精致。也许Pandas的git-hub中的功能请求是有序的......

使用转换器功能

但是,目前,您可以定义自己的函数并将其传递给read_csv中的converters参数:

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行重复,这是一个公平的讨价还价。这种方法也可能比使用转换器功能更快。

答案 1 :(得分:1)

Pandas没有这样做的功能。您可以在常规Python中实现它,如下所示:

import csv
import pandas as pd

def filter_records(records):
    """Given an iterable of dicts, converts values to int.
    Discards any record which has an empty field."""

    for record in records:
        for k, v in record.iteritems():
            if v == '':
                break
            record[k] = int(v)
        else: # this executes whenever break did not
            yield record

with open('t.csv') as infile:
    records = csv.DictReader(infile)
    df = pd.DataFrame.from_records(filter_records(records))

Pandas无论如何都在内部使用csv模块。如果上面的表现证明是一个问题,你可以用Cython加速它(Pandas也使用它)。

答案 2 :(得分:-1)

如果您显示一些数据,那么SO ppl可能有所帮助。

pd.read_csv('FILE', keep_default_na=False)

首先尝试这些:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

na_values : str or list-like or dict, default None
Additional strings to recognize as NA/NaN. If dict passed, specific per-column NA values. By default the following values are interpreted as NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’.

keep_default_na : bool, default True
If na_values are specified and keep_default_na is False the default NaN values are overridden, otherwise they’re appended to.

na_filter : boolean, default True
    Detect missing value markers (empty strings and the value of na_values). In data without any NAs, passing na_filter=False can improve the performance of reading a large file