想要替换“数字”和“日期”列中的所有无效数据类型。初始表是这样的:
name number date
a 1.2 123.2
b 123.2 3/13/2019
c 2.3 3/14/2019
d 569 3/15/2019
e abc 3/15/2019
f 30 abc
g 39.8 -3
h 3/21/2019 3/19/2019
i -395 3/20/2019
j 4 3/21/2019
清理后,该表应如下所示:所有无效的数据类型输入均已替换为none:
name number date
a 1.2
b 123.2 3/13/2019
c 2.3 3/14/2019
d 569 3/15/2019
e 3/15/2019
f 30
g 39.8
h 3/19/2019
i -395 3/20/2019
j 4 3/21/2019
我只能将字符串输入替换为None,我不知道如何将数字输入替换为'date'列中的None,也不知道如何将日期时间输入替换为'number'列中的None。如果datetime列中有数字输入或number列中有日期时间输入,我的代码将显示错误:
'float'对象没有属性'strftime'
datetime2数据类型到datetime数据类型的转换导致超出范围的值。
df['date']=df['date'].apply(lambda x: None if str(type(x))=="<class 'str'>" else x)
df['date']=df['date'].apply(lambda x: x.strftime('%m/%d/%Y')if not pd.isnull(x) else '')
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df['number'] = df['number'].apply(lambda x: None if str(type(x))=="<class 'str'>" else x)
可能有更好的方法,但是我立即想到的方法是使用正则表达式。这是解决方案。
import numpy as np
import pandas as pd
import re
>>>df
name number date
a 1.2 123.2
b 123.2 3/13/2019
c 2.3 3/14/2019
d 569 3/15/2019
e abc 3/15/2019
f 30 abc
g 39.8 -3
h 3/21/2019 3/19/2019
i -395 3/20/2019
j 4 3/21/2019
# Matches m/dd/yyyy
dt_pattern = r'[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}'
dt = re.compile(dt_pattern)
# alphabet strings
wd_pattern = r'[a-zA-Z]+'
wd = re.compile(wd_pattern)
df.loc[:,'date'] = [d if dt.match(str(d)) else np.nan for d in df.loc[:, 'date']]
df.loc[:,'number'] = [d if not any([wd.match(str(d)), dt.match(str(d))]) else np.nan for d in df.loc[:, 'number']]
df['date'] = pd.to_datetime(df['date'], errors='coerce')
>>>df
name number date
0 a 1.2 NaT
1 b 123.2 2019-03-13
2 c 2.3 2019-03-14
3 d 569 2019-03-15
4 e NaN 2019-03-15
5 f 30 NaT
6 g 39.8 NaT
7 h NaN 2019-03-19
8 i -395 2019-03-20
9 j 4 2019-03-21
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句