【问题标题】:replacing NaT with 0 days用 0 天替换 NaT
【发布时间】:2018-08-20 19:21:41
【问题描述】:

我有一个看起来是谎言的 pandas 数据框:

A      
3 days    
NaT       
4 days

有没有办法将 NaT 替换为 0 天?

谢谢, 埃德

【问题讨论】:

  • df.fillna(pd.Timedelta('0 days'))
  • df.fillna(0) 如果dtypestimedelta64[ns]
  • df.fillna(0) 已弃用(将整数传递给 fillna 已弃用,将在未来版本中引发 TypeError。)

标签: python python-3.x pandas


【解决方案1】:

请注意,其他答案不再是最新的。首选语法是:

df['column'].fillna(pd.Timedelta(seconds=0))

前面提到的

df['column'].fillna(0)

将导致:

FutureWarning:不推荐将整数传递给 fillna,将引发 未来版本中的 TypeError。要保留旧的行为,请通过 pd.Timedelta(seconds=n) 代替。 df['column'] = df['column'].fillna(0)

【讨论】:

    【解决方案2】:

    另一种方法是使用 .replace

    d = {'A': ['3 days', '4 days', 'NaT']}
    df = pd.DataFrame(data=d)
    df.replace({'NaT': '0 day'}, inplace=True)
    

    输出:

        A
    0   3 days
    1   4 days
    2   0 day
    

    【讨论】:

    • 认为 NaT 不是字符串。
    • NaT 不是字符串...
    【解决方案3】:

    当尝试使用版本 0.24.1 实现 manoj 的基于替换的答案时,我发现我必须使用“pandas.NaT”而不仅仅是字符串“Nat”:

    import pandas as pd
    ...
    
    df.replace({pd.NaT: "0 days"}, inplace=True)
    

    【讨论】:

    • 很好的答案,特别是因为 pd.np 正在贬值。这对我来说非常有效。
    • 在此基础上,我只是将“0 天”转换为空值,以作为日期时间类型存在于我的数据库中:df.replace({pd.NaT: None}, inplace=True)。否则我会出错。
    【解决方案4】:
    df.A = pd.to_timedelta(df.A)
    df.fillna(0)
    
           A
    0 3 days
    1 0 days
    2 4 days
    

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2014-02-08
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多