【问题标题】:Pandas cut results in Nan valuesPandas 削减了 Nan 值
【发布时间】:2019-09-29 03:35:05
【问题描述】:

我有很多缺失值的以下列“?”在 store_data 数据帧中

>>>store_data['trestbps']
0      140
1      130
2      132
3      142
4      110
5      120
6      150
7      180
8      120
9      160
10     126
11     140
12     110
13       ?

我用 -999 替换了所有缺失值

store_data.replace('?', -999, inplace = True)

>>>store_data['trestbps']
0       140
1       130
2       132
3       142
4       110
5       120
6       150
7       180
8       120
9       160
10      126
11      140
12      110
13     -999

现在我想对值进行分箱,我使用了这段代码,但输出显示为 Nan:

trestbps = store_data['trestbps']
trestbps_bins = [-999,120,140,200]
store_data['trestbps'] = pd.cut(trestbps,trestbps_bins)
>>>store_data['trestbps']
0      NaN
1      NaN
2      NaN
3      NaN
4      NaN
5      NaN
6      NaN
7      NaN
8      NaN
9      NaN
10     NaN
11     NaN
12     NaN
13     NaN

当没有缺失值时,类别可以正常工作。 我希望我的输出从 (0-12) 分类,只有 13 被 -999 替换。我怎样才能做到这一点?

【问题讨论】:

    标签: pandas replace nan cut bin


    【解决方案1】:

    IIUC,你可以这样做:

    bins=[0,120,140,200] #set bins
    df.trestbps=pd.cut(df.trestbps,bins) #do the cut
    df.trestbps=df.trestbps.values.add_categories(999) #add category as 999
    df.trestbps.fillna(999) #fillna with 999
    

    0     (120, 140]
    1     (120, 140]
    2     (120, 140]
    3     (140, 200]
    4       (0, 120]
    5       (0, 120]
    6     (140, 200]
    7     (140, 200]
    8       (0, 120]
    9     (140, 200]
    10    (120, 140]
    11    (120, 140]
    12      (0, 120]
    13           999
    

    【讨论】:

    • 我仍然有相同的输出。编译前两行和所有四行后的所有列的 NaN。不知道问题出在哪里
    • 使用store_data.dtypes检查它们实际上是数字我敢打赌,由于?,列dtype实际上是对象,所以当你进行剪切时它不起作用,因为它们被视为字符串。在 anky_91 示例中,它们是浮点数,因为他使用的是 NaN 而不是“?”
    • @BenPap 非常感谢!这解释了原因。我将列转换为整数,现在可以正常工作了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多