我有一个非常大的csv,我需要阅读.为了使这快速和节省RAM使用我使用read_csv并将一些列的dtype设置为np.uint32.问题是某些行缺少值,而pandas使用float来表示这些值.
Kar*_*tik 10
如果你能在阅读过程中填写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=...)
Run Code Online (Sandbox Code Playgroud)
请注意,converters需要a dict,因此您需要为每个要处理NaN的列指定它.如果很多列受到影响,它可能会有点令人厌烦.您可以指定列名称或数字作为键.
另请注意,这可能会降低read_csv性能,具体取决于converters函数的处理方式.此外,如果您只有一列需要在读取期间处理NaN,则可以跳过正确的函数定义并使用lambda函数:
df = pd.read_csv(file, converters={colWithNaN : lambda x: 0 if x == np.nan else x}, dtypes=...)
Run Code Online (Sandbox Code Playgroud)
你也可以用你缝合在一起的小块来读取文件以获得最终输出.你可以用这种方式做很多事情.这是一个说明性的例子:
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
Run Code Online (Sandbox Code Playgroud)
请注意,此方法不严格复制数据.有一段时间,数据chunk存在两次,就在result.append语句之后,但只有chunksize行重复,这是一个公平的讨价还价.该方法也可以比使用转换器功能更快.
| 归档时间: |
|
| 查看次数: |
10388 次 |
| 最近记录: |