在某些情况下,Dataframe.applymap在NaT上跳闸?

时间:2019-02-13 10:45:25

标签: python pandas

Pandas 23.4版

我认为applymap试图将函数的矢量化版本应用于整个列,但是当该列包含NaT时会感到困惑。

例如。我用一个包含有效时间戳和NaT的单列创建一个数据框。然后我应用map一个函数,该函数应该格式化日期时间,在“ T”处将其分割,取其时间分量,然后将其通过正则表达式修剪掉毫秒之后的所有数字。

import re
import pandas as pd    
df = pd.DataFrame([[pd.Timestamp.now()], [pd.NaT]], columns=['T'])
df.applymap(lambda x:
    x if pd.isnull(x) or not hasattr(x, 'isoformat') else 
    re.sub(r'(\d{2}:\d{2}:\d{2}\.\d{3})\d*', r'\1', x.isoformat().split('T')[1]))

运行此命令的结果是...

    T
0   10:25:08.686000
1   NaT

(如果正则表达式正在运行,我希望看到10:25:08.686)。

似乎已经发生了x.isoformat()。split('T')[1]已在该系列上运行,但是正则表达式未能在结果系列上运行,因为它包含空值。

如果将'*'附加到函数主体,这似乎将applymap强制到正确的路径上(尽管以在字符串开头加*为代价)...

df.applymap(lambda x: 
      x if pd.isnull(x) or not hasattr(x, 'isoformat') else 
      ('*'+re.sub(r'(\d{2}:\d{2}:\d{2}\.\d{3})\d*', r'\1', x.isoformat().split('T')[1])))

...给予...

    T
0   *10:25:08.686
1   NaT

如果该列不包含任何NaT,则一切正常。

0 个答案:

没有答案