如何使用DataFrame.apply()

时间:2017-05-20 04:23:09

标签: python pandas exception-handling apply

我想DataFrame.apply() dateutil.parser.parse到日期字符串的pandas数据帧列,但有些单元格是NaN,因此会引发异常。 pandastyle处理这个问题的方法是什么?

我应该编写另一个替换parse()的函数来处理错误并应用它吗?用其他方式处理它?<​​/ p>

3 个答案:

答案 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对象同时具有mappederrors属性,这些属性是包含映射记录和错误记录的数据帧。

mapping.mapped

| name   | birthdate  |
| -      | -          |
| Alice  | 1996-01-01 |
| George | 1997-06-21 |

mapping.errors

| name   | birthdate  | __error__                                         |
| -      | -          | -                                                 |
| sam    | Yesterday  | {'msg': 'ValueError(Yesterday): ('Unknown stri... |