首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas数据帧: df.apply忽略错误行

Pandas数据帧: df.apply忽略错误行
EN

Stack Overflow用户
提问于 2020-10-27 21:09:24
回答 3查看 765关注 0票数 2

早上好!我正在尝试将具有各种格式的多个日期的列转换为datetime列。

代码语言:javascript
复制
import pandas as pd

data = {
'c1':['2020/10/01','10/01/2020','10/1/2020','31/08/2020','12-21-2020','5-3-2020','05-03-2020','ERRER']    
}

df = pd.DataFrame (data, columns = ['c1'])

上面的代码创建了我要测试的数据帧。如果我运行以下代码,我会得到一个错误,因为'ERRER‘不是一个有效的日期:

代码语言:javascript
复制
df['c2'] = df.apply(lambda x: pd.to_datetime(x['c1']), axis=1)

如果不能转换为日期时间,有没有办法跳过apply函数中的行?或者将错误行转换为默认日期(即'1900-01-01')?

EN

回答 3

Stack Overflow用户

发布于 2020-10-27 21:12:25

errorscoerce一起传递,因为无法转换的将返回NaT

代码语言:javascript
复制
df['c2'] = pd.to_datetime(df['c1'], errors='coerce')
df
Out[76]: 
           c1         c2
0  2020/10/01 2020-10-01
1  10/01/2020 2020-10-01
2   10/1/2020 2020-10-01
3  31/08/2020 2020-08-31
4  12-21-2020 2020-12-21
5    5-3-2020 2020-05-03
6  05-03-2020 2020-05-03
7       ERRER        NaT
票数 1
EN

Stack Overflow用户

发布于 2020-10-27 21:12:26

如果在to_datetime中使用errors='coerce' get NaT (缺少DateTime值)如果不是类似DateTime值-您可以传递列以提高性能,而不是传递apply以进行循环:

代码语言:javascript
复制
df['c2'] = pd.to_datetime(df['c1'], errors='coerce')
print (df)
           c1         c2
0  2020/10/01 2020-10-01
1  10/01/2020 2020-10-01
2   10/1/2020 2020-10-01
3  31/08/2020 2020-08-31
4  12-21-2020 2020-12-21
5    5-3-2020 2020-05-03
6  05-03-2020 2020-05-03
7       ERRER        NaT

然后按列c2删除带有NaT%s的行

代码语言:javascript
复制
df1 = df.dropna(subset=['c2'])
print (df1)
           c1         c2
0  2020/10/01 2020-10-01
1  10/01/2020 2020-10-01
2   10/1/2020 2020-10-01
3  31/08/2020 2020-08-31
4  12-21-2020 2020-12-21
5    5-3-2020 2020-05-03
6  05-03-2020 2020-05-03

或者,您可以将它们替换为某个日期时间(而不是字符串'1900-01-01'):

代码语言:javascript
复制
df['c2'] = pd.to_datetime(df['c1'], errors='coerce').fillna(pd.Timestamp('1900-01-01'))
print (df)
           c1         c2
0  2020/10/01 2020-10-01
1  10/01/2020 2020-10-01
2   10/1/2020 2020-10-01
3  31/08/2020 2020-08-31
4  12-21-2020 2020-12-21
5    5-3-2020 2020-05-03
6  05-03-2020 2020-05-03
7       ERRER 1900-01-01

print (df.dtypes)
c1            object
c2    datetime64[ns]
dtype: object
票数 1
EN

Stack Overflow用户

发布于 2020-10-27 21:24:16

你可能想要使用replace提前转换错误。这意味着缺少值NaT的其他行将保持为NaT。

代码语言:javascript
复制
df['c1'] = df['c1'].replace('ERRER', '01/01/1900')

在此之后,它应该会起作用:

代码语言:javascript
复制
df['c2'] = df.apply(lambda x: pd.to_datetime(x['c1']), axis=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64555162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档