我有一个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
答案 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
行中执行此操作的方法。