read_csv的日期包含点作为小数点分隔符,并且以逗号浮动作为小数点分隔符?

时间:2019-09-05 14:31:48

标签: python pandas

我有一个csv文件,其布局如下所示:

date    a    b
2019-08-28 10:43:41.098  -1,9  -2,5

当我使用

df = pd.read_csv(file,sep=None,parse_dates[0],engine='python',decimal=',')

,然后看一下结果数据框,Pandas将date识别为dtype: datetime64[ns],将其他列识别为dtype: object

我已尝试完全跳过decimal=','部分,但这无济于事。我可以尝试将逗号单独替换为点,但我想看看是否有办法在直接导入csv文件时做到这一点。

预先感谢

编辑:MWE

data.txt

date    a   b   
08/28/2019 10:43:41.0980    -1,9    -2,5

import pandas as pd

df = pd.read_csv('C:/Users/USERNAME/Documents/Python/data.txt',sep=None,parse_dates=[0],engine='python').dropna(how='any',axis='columns')

print(df)

此代码导致df等于上述data.txt,但是数据类型为:

date    datetime64[ns]
a               object
b               object
dtype: object

使用sep='\s{2,}'作为@furas建议会导致df为:

                             date\ta\tb
0  08/28/2019 10:43:41.0980\t-1,9\t-2,5

2 个答案:

答案 0 :(得分:0)

如果列a和b中的其余数据集与相同的float格式不匹配,则熊猫将推断dtype = object,即df = pd.DataFrame({'a': [1, 34, 34, 34, 'd', 2], 'b': [1, 34, 34, 34, 23, 2]}) 产生

0 1 1 34 2 34 3 34 4 d 5 2 Name: a, dtype: object 0 1 1 34 2 34 3 34 4 23 5 2 Name: b, dtype: int64

如果要丢弃不干净的行,可以运行

df = df.apply(pd.to_numeric, errors='coerce').dropna() Out: a b 0 1.0 1 1 34.0 34 2 34.0 34 3 34.0 34 5 2.0 2

答案 1 :(得分:0)

我最终要做的是:

df = pd.read_csv(file,sep=None,parse_dates[0],engine='python')

df = df.drop(columns=['date']).astype(str).apply(lambda x: x.str.replace(',','.')).astype(float).join(df['date'])

切出'date'列,转换为str,将点替换为逗号,然后转换为float可确保无论数据如何读取和使用正确的十进制分隔符数据集中的小数点分隔符。

如果数据具有点作为小数点分隔符,则代码行在增加计算时间的同时基本上不会执行任何操作(这在处理大型数据集时对我来说很重要),但是这种方法似乎没有问题。

我仍然想找到一种直接在read_csv行中执行此操作的方法。