可能的边缘情况:pandas.read_csv

4

为什么在 engine='python' 的情况下,对于由数字和点组成的字符串,所有点都被剥离,即使定义了 dtype?

当处理包含以下内容的 csv 文件时,会出现意外行为:

  • 字符串仅由数字和单个点组成
  • 设置了 read_csv 参数:engine='python'thousands='.'

测试代码示例:

import pandas as pd  # version 1.5.2
import io

data = """a;b;c\n0000.7995;16.000;0\n3.03.001.00514;0;4.000\n4923.600.041;23.000;131"""

df1 = pd.read_csv(io.StringIO(data), sep=';', dtype={'a': str}, thousands='.', engine='c')
df2 = pd.read_csv(io.StringIO(data), sep=';', dtype={'a': str}, thousands='.', engine='python')

df1输出:列a按预期和期望的方式

|    | a              |     b |    c |
|---:|:---------------|------:|-----:|
|  0 | 0000.7995      | 16000 |    0 |
|  1 | 3.03.001.00514 |     0 | 4000 |
|  2 | 4923.600.041   | 23000 |  131 |

df2输出:列a不符合预期

|    |           a |     b |    c |
|---:|------------:|------:|-----:|
|  0 |    00007995 | 16000 |    0 |
|  1 | 30300100514 |     0 | 4000 |
|  2 |  4923600041 | 23000 |  131 |

尽管dtype = {'a': str},但似乎engine ='python'engine='c'的处理方式不同。dtype={'a':object}得出相同的结果。

我花了相当长的时间了解pandas read_csv的所有设置,我看不到可以设置其他选项来更改此行为。有我忽略的东西,还是这种行为很“正常”?


现在也对此很好奇。看起来是一个有效的边界情况。 - crashMOGWAI
1个回答

1

看起来像是一个 bug (没有被报告 - 所以我提交了它)。只能创建一个笨拙的解决方法:

df = pd.read_csv(io.StringIO(data), sep=';', dtype=str, engine='python')
int_columns = ['b', 'c']
df[int_columns] = df[int_columns].apply(lambda x: x.str.replace('.', '')).astype(int)
a b c
0000.7995 16000 0
3.03.001.00514 0 4000
4923.600.041 23000 131

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接