Python:读取CSV-fi时替换值

2024-04-26 23:48:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件,其中有几个列包含整数和一个字符串。当然,由于混合的数据类型,我会收到一个dtype警告。我用这个命令读了这个文件。在

df = pd.read_csv(path, sep=";", na_values=missing)

我可以使用low_memory=Falsedtype=object使警告静音,但据我所知,这使得读取文件的内存效率不高。在

我也可以使用na_values="my_string",但是我还有其他缺失的值(应该是真正的缺失值),所以不想混合它们。在

我不需要字符串的值,只需要它的值count,所以我想用一个整数替换它。像这样。在

^{pr2}$

但是,在读取CSV文件时,是否也可以替换值?或者还有别的解决方案吗?我不想简单地让警告保持沉默,而是想找到一个更节省内存的解决方案。在

(我知道this answer,但它并不能真正帮助我解决问题。)


Tags: 文件csv内存字符串命令警告df整数
2条回答

您可以使用converters

In [156]: def conv(val, default_val=999):
     ...:     try:
     ...:         return int(val)
     ...:     except ValueError:
     ...:         return default_val
     ...:

In [157]: conv('a')
Out[157]: 999

In [158]: pd.read_csv(r'C:\Temp\test.csv', converters={'a':conv})
Out[158]:
     a   b           c
0    1  11  2000-01-01
1  999  12  2000-01-02
2    3  13  2000-01-02

另一种方法是在解析CSV文件后以矢量化方式转换列:

^{pr2}$

300.000行DF的速度比较:

In [175]: df = pd.concat([df] * 10**5, ignore_index=True)

In [176]: df.shape
Out[176]: (300000, 3)

In [177]: filename = r'C:\Temp\test.csv'

In [184]: df.to_csv(filename, index=False)

In [185]: %%timeit
     ...: df = pd.read_csv(filename, parse_dates=['c'], converters={'a':conv, 'b':conv})
     ...:
632 ms ± 25.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [186]: %%timeit
     ...: df = pd.read_csv(filename, parse_dates=['c'])
     ...: df[int_cols] = df[int_cols].apply(pd.to_numeric, errors='coerce').fillna(999).astype(int)
     ...:
706 ms ± 60.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

读取CSV文件时无法替换de值。加载并保存数据后,必须进行替换。那你就不会再收到警告了。在

相关问题 更多 >