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