Python:读取 CSV 文件时替换值

Posted

技术标签:

【中文标题】Python:读取 CSV 文件时替换值【英文标题】:Python: Replace values while reading CSV file 【发布时间】:2018-07-27 09:21:00 【问题描述】:

我有一个 CSV 文件,其中包含多个包含整数和字符串的列。自然,由于混合的 dtype,我收到了 dtype 警告。我用这个通用命令读取了文件。

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

我可以使用 low_memory=Falsedtype=object 来消除警告,但据我所知,这会使读取文件的内存效率降低。

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

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

df.replace(to_replace="my_string", value=999)

但是,是否也可以在读取 CSV 文件时替换值?或者是否存在其他解决方案?我不想简单地使警告静音,而是要找到一种内存效率更高的解决方案。

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

【问题讨论】:

你知道“有问题”列的名称吗? @MaxU 是的,我知道。 【参考方案1】:

你可以使用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 文件后以矢量化方式转换列:

In [166]: df = pd.read_csv(r'C:\Temp\test.csv', parse_dates=['c'])

In [167]: df
Out[167]:
     a    b          c
0    1  AAA 2000-01-01
1  XXX   12 2000-01-02
2    3   13 2000-01-02

In [168]: df.dtypes
Out[168]:
a            object
b            object
c    datetime64[ns]
dtype: object

In [169]: int_cols = ['a','b']

In [170]: df[int_cols] = df[int_cols].apply(pd.to_numeric, errors='coerce').fillna(999).astype(int)

In [171]: df
Out[171]:
     a    b          c
0    1  999 2000-01-01
1  999   12 2000-01-02
2    3   13 2000-01-02

In [172]: df.dtypes
Out[172]:
a             int32
b             int32
c    datetime64[ns]
dtype: object

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)

【讨论】:

@NK_,很高兴我能帮上忙 :)【参考方案2】:

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

【讨论】:

以上是关于Python:读取 CSV 文件时替换值的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用read_csv函数读取文件时指定数据列的数据类型pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串

读取csv字典变成str了怎么办

Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')

如何在读取 CSV 文件时将字符串值转换为整数值?

如何用python读取csv表格中的时间列,并进行时间最大值和最小值的相减?求代码。。。

python之csv操作