我想要DataFrame.apply()
dateutil.parser.parse
到日期字符串的pandas数据框列,但有些单元格是NaN
的,所以它引发了一个异常。处理这个问题的方法是什么?
我是否应该编写另一个函数来代替parse()
来处理错误并应用它呢?以其他方式处理它?
发布于 2017-05-20 12:26:22
我认为您需要带参数errors='coerce'
的to_datetime
来将不可解析的值转换为NaT
(pandas中datetime的NaN
):
df['col'] = pd.to_datetime(df['col'], errors='coerce')
示例:
df = pd.DataFrame({'date' : ['2015-01-01 19:00:20', np.nan, '2015-02-03 17:00:00', 'NA']})
print (df)
date
0 2015-01-01 19:00:20
1 NaN
2 2015-02-03 17:00:00
3 NA
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print (df)
date
0 2015-01-01 19:00:20
1 NaT
2 2015-02-03 17:00:00
3 NaT
print (df['date'].dtypes)
datetime64[ns]
发布于 2017-05-20 12:30:04
要使您当前的方法工作,您可以添加一个if else来检查该值是否为nan。
df.apply(lambda x: your_functions(x['col']) if pd.notnull(x['col']) else np.nan,axis=1)
发布于 2018-06-20 04:47:27
被接受的答案肯定适用于所提出的具体示例。然而,Pandas似乎确实缺乏处理转换异常的通用方法。我最近发布了一个pandas-mapper包,它可以更通用地解决这个问题(https://github.com/inside-track/pandas-mapper)。
在上面提到的情况下,可以使用pandas-mapper将错误记录重定向到另一个数据帧,然后可以相应地处理该数据帧。例如,假设我们有一个同时包含"name“和"birthdate”列的dataframe,我们必须对其进行转换以解析字符串date并将名称大写。pandas-mapper可以像这样使用
import pandas as pd
import pandas_mapper
import dateutil
df = pd.DataFrame({
'name': ['alice', 'george', 'sam'],
'birthdate': ['1996-01-01', '1997-06-21', 'Yesterday'],
})
mapping = df.mapping(
[
('name', 'name', lambda v: v.capitalize()),
('birthdate', 'birthdate', dateutil.parser.parse),
],
on_error='redirect'
)
mapping
对象同时具有mapped
和errors
属性,它们是包含映射记录和错误记录的数据帧。
mapping.mapped
| name | birthdate |
| - | - |
| Alice | 1996-01-01 |
| George | 1997-06-21 |
mapping.errors
| name | birthdate | __error__ |
| - | - | - |
| sam | Yesterday | {'msg': 'ValueError(Yesterday): ('Unknown stri... |
https://stackoverflow.com/questions/44081879
复制相似问题