我想DataFrame.apply()
dateutil.parser.parse
到日期字符串的pandas数据帧列,但有些单元格是NaN
,因此会引发异常。 pandastyle处理这个问题的方法是什么?
我应该编写另一个替换parse()
的函数来处理错误并应用它吗?用其他方式处理它?</ p>
答案 0 :(得分:1)
我认为您需要使用参数errors='coerce'
to_datetime
将非可解析值转换为NaT
(pandas中的日期时间为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]
答案 1 :(得分:0)
要使当前方法有效,可以添加if else来检查值是否为nan。
df.apply(lambda x: your_functions(x['col']) if pd.notnull(x['col']) else np.nan,axis=1)
答案 2 :(得分:0)
公认的答案当然适用于提出的具体示例。但是,Pandas似乎缺乏处理转换异常的通用方法。我最近发布了一个pandas-mapper软件包,可以更一般地解决此问题(https://github.com/inside-track/pandas-mapper)。
在上述情况下,可以使用pandas-mapper将错误记录重定向到另一个可以相应处理的数据框。例如,假设我们有一个同时包含“名称”和“出生日期”列的数据框,我们必须对其进行转换以解析字符串日期并大写名称。然后可以像这样使用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... |