为什么在 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的所有设置,我看不到可以设置其他选项来更改此行为。有我忽略的东西,还是这种行为很“正常”?