我有一个非常大的 csv,我需要读入它。为了加快速度并节省 RAM 使用量,我正在使用 read_csv 并将某些列的 dtype 设置为 np.uint32。问题是有些行有缺失值,而 pandas 使用浮点数来表示这些值。
- 是否可以简单地跳过具有缺失值的行?我知道我可以在阅读整个文件后执行此操作,但这意味着我无法在此之前设置数据类型,因此会使用过多的 RAM。
- 是否可以将缺失值转换为我在读取数据期间选择的其他值?
原文由 Simd 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个非常大的 csv,我需要读入它。为了加快速度并节省 RAM 使用量,我正在使用 read_csv 并将某些列的 dtype 设置为 np.uint32。问题是有些行有缺失值,而 pandas 使用浮点数来表示这些值。
原文由 Simd 发布,翻译遵循 CC BY-SA 4.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 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答865 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
如果您可以在读取过程中用 --- 填充
NaN
,0
了。也许 Pandas 的 git-hub 中的功能请求是有序的……使用转换器功能
但是,目前,您可以定义自己的函数来执行此操作,并将其传递给 --- 中的
read_csv
converters
参数:请注意,
converters
采用dict
,因此您需要为每个要处理 NaN 的列指定它。如果很多列受到影响,它会变得有点烦人。您可以指定列名或数字作为键。另请注意,这可能会降低您的
read_csv
性能,具体取决于converters
函数的处理方式。此外,如果您只有一列需要在读取期间处理 NaN,则可以跳过正确的函数定义并改用lambda
函数:分块阅读
您还可以将文件分成小块读取,然后拼接在一起以获得最终输出。你可以用这种方式做很多事情。这是一个说明性示例:
请注意,此方法不会严格复制数据。有一段时间
chunk
中的数据存在两次,就在result.append
语句之后,但只有chunksize
行被重复,这是一个公平的交易。这种方法也可能比使用转换器函数更快。