当前位置: 首页 > 知识库问答 >
问题:

Python:读取CSV文件时替换值

慕凌龙
2023-03-14

我有一个CSV文件,其中有几列包含整数和一个字符串。很自然,由于混合的数据类型,我会得到一个数据类型警告。我用这个通用命令读取文件。

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

我可以使用low_memory=Falsedtype=ject来静音警告,但据我所知,这使得读取我的文件不会更有效地使用内存。

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

我不需要字符串的值,只需要它的值计数,所以我想用一个整数代替它。类似这样的。

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

但是,在读取CSV文件时,是否也可以替换一个值?还是存在另一种解决方案?我不想简单地关闭警告,而是找到一个更有效的解决方案。

(我知道这个答案,但它并没有真正帮助我解决问题。)

共有2个答案

司空鸿禧
2023-03-14

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

韦知
2023-03-14

您可以使用转换器:

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)
 类似资料:
  • 我试图读取CSV文件,但它抛出了一个错误。我无法理解我的语法有什么问题,或者我是否需要向我的read_csv添加更多属性。 我试了一下这个解决办法 UnicodeDecodeError:“utf-8”编解码器无法解码位置21中的字节0x96:起始字节也无效。但它不起作用 [错误] UnicodeDecodeError回溯(最近一次调用)pandas/_libs/解析器。大熊猫中的pyx_图书馆。解

  • 我的本地文件夹中有一个csv文件。我想阅读它,删除一列,并替换同一文件夹中的文件。 实际样本数据: 样本数据中的预期数据: 在这种情况下,我想删除列LASTNAME。在Java中可以有效地完成吗?

  • 我正在运行一个程序,可以处理30000个类似的文件。他们中的一些人正在停止并产生这个错误...

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此,经过它们以节省时间时,我离开了循

  • 问题内容: 我正在尝试使用Python(仅法语和/或西班牙语字符)读取带有重音字符的CSV文件。基于csvreader的Python 2.5文档(http://docs.python.org/library/csv.html),由于csvreader仅支持ASCII,因此我想出了以下代码来读取CSV文件。 以下是我尝试阅读的CSV文件的摘录: 即使我尝试将编码/解码为UTF-8,我仍然收到以下异常

  • 本文向大家介绍python 读取文件并替换字段的实例,包括了python 读取文件并替换字段的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 原文: 参考备忘,指针这个没明白什么意思,找时间验证下 以上这篇python 读取文件并替换字段的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。