pandas cut():如何转换nans?或者将输出转换为非分类?

Pyt*_*ous 9 python pandas categorical-data

我在带有 nans 的数据框列上使用 pandas.cut()。我需要在 pandas.cut() 的输出上运行 groupby,所以我需要将 nans 转换为其他内容(在输出中,而不是在输入数据中),否则 groupby 会愚蠢而愤怒地忽略它们。

我知道 cut() 现在输出分类数据,但我找不到向输出添加类别的方法。我已经尝试过 add_categories(),它运行时没有警告也没有错误,但它不起作用,因为没有添加类别,并且实际上,正是由于这个原因,fillna 失败了。下面是一个极简的例子。

有任何想法吗?

或者是否有一种简单的方法可以将此分类对象转换为非分类对象?我试过 np.asarray() 但没有运气 - 它变成了一个包含 Interval 对象的数组

import pandas as pd
import numpy as np

x=[np.nan,4,6]
intervals =[-np.inf,4,np.inf]
out_nolabels=pd.cut(x,intervals)
out_labels=pd.cut(x,intervals, labels=['<=4','>4'])
out_nolabels.add_categories(['missing'])
out_labels.add_categories(['missing'])

print(out_labels)
print(out_nolabels)

out_labels=out_labels.fillna('missing')
out_nolabels=out_nolabels.fillna('missing')
Run Code Online (Sandbox Code Playgroud)

PS 这是关于 Pandas 如何成为处理丢失数据的最差工具的另一个问题。这就像有人聚在一起思考:我们如何让那些愚蠢到用 Python 和 Pandas 分析数据的人生活更艰难?我知道,让我们从 groupby 中删除 nans,甚至没有警告!

Flo*_*oor 9

正如文档所说,越界数据将被视为 Na 分类对象,因此您不能在分类数据中使用带有某些常量的 fillna since the new value you are filling is not in that categories

任何 NA 值在结果中都是 NA。越界值在结果分类对象中将为 NA

你不能使用,x.fillna('missing')因为missing不在类别中,x但你可以使用,x.fillna('>4')因为>4在类别中。

我们可以在这里使用 np.where 来克服这个问题

x = pd.cut(df['id'],intervals, labels=['<=4','>4'])

np.where(x.isnull(),'missing',x)
array(['<=4', '<=4', '<=4', '<=4', 'missing', 'missing'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

add_categories值即

x = pd.cut(df['id'],intervals, labels=['<=4','>4']).values.add_categories('missing')
x.fillna('missing')

[<=4, <=4, <=4, <=4, missing, missing]
Categories (3, object): [<=4 < >4 < missing]
Run Code Online (Sandbox Code Playgroud)

如果你想对 nan 进行分组并保持 dtype,一种方法是将其强制转换为 str,即如果你有一个数据框

df = pd.DataFrame({'id':[1,1,1,4,np.nan,np.nan],'value':[4,5,6,7,8,1]})

df.groupby(df.id.astype(str)).mean()
Run Code Online (Sandbox Code Playgroud)

输出 :

     id值
ID             
1.0 1.0 5.0
4.0 4.0 7.0
南南 4.5