【问题标题】:pandas cut a series with nan valuespandas 用 nan 值剪切了一个系列
【发布时间】:2018-10-31 19:04:14
【问题描述】:

我想将 pandas 剪切功能应用于包含 NaN 的系列。期望的行为是它将非 NaN 元素分桶并为 NaN 元素返回 NaN。

import pandas as pd
numbers_with_nan = pd.Series([3,1,2,pd.NaT,3])
numbers_without_nan = numbers_with_nan.dropna()

对于没有 NaN 的系列,切割效果很好:

pd.cut(numbers_without_nan, bins=[1,2,3], include_lowest=True)
0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
4      (2.0, 3.0]

当我剪切包含 NaN 的系列时,元素 3 正确返回为 NaN,但最后一个元素分配了错误的 bin:

pd.cut(numbers_with_nan, bins=[1,2,3], include_lowest=True)
0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
3             NaN
4    (0.999, 2.0]

我怎样才能得到以下输出?

0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
3             NaN
4      (2.0, 3.0]

【问题讨论】:

    标签: python pandas nan


    【解决方案1】:

    这很奇怪。问题不在于pd.NaT,而是您的系列具有object dtype 而不是常规数字系列,例如float, int.

    快速解决方法是通过fillnapd.NaT 替换为np.nan。这会触发从objectfloat64 dtype 的系列转换,并且还可能带来更好的性能。

    s = pd.Series([3, 1, 2, pd.NaT, 3])
    
    res = pd.cut(s.fillna(np.nan), bins=[1, 2, 3], include_lowest=True)
    
    print(res)
    
    0    (2, 3]
    1    [1, 2]
    2    [1, 2]
    3       NaN
    4    (2, 3]
    dtype: category
    Categories (2, object): [[1, 2] < (2, 3]]
    

    更通用的解决方案是预先显式转换为数字:

    s = pd.to_numeric(s, errors='coerce')
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2019-10-09
      • 2019-09-29
      • 2014-12-02
      • 2017-08-25
      • 2021-12-31
      • 2019-02-25
      相关资源
      最近更新 更多