跳过 read_csv 中缺失值的行

新手上路,请多包涵

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

  1. 是否可以简单地跳过具有缺失值的行?我知道我可以在阅读整个文件后执行此操作,但这意味着我无法在此之前设置数据类型,因此会使用过多的 RAM。
  2. 是否可以将缺失值转换为我在读取数据期间选择的其他值?

原文由 Simd 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
2 个回答

如果您可以在读取过程中用 --- 填充 NaN0 了。也许 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 行被重复,这是一个公平的交易。这种方法也可能比使用转换器函数更快。

原文由 Kartik 发布,翻译遵循 CC BY-SA 3.0 许可协议

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))

无论如何,熊猫在内部使用 csv 模块。如果上述性能出现问题,您可以使用 Cython(Pandas 也使用)来加速它。

原文由 John Zwinck 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题