gpt4 book ai didi

python - Nans on pd.factorize 返回对象

转载 作者:行者123 更新时间:2023-11-30 22:47:43 29 4
gpt4 key购买 nike

我使用下面的代码对数据集进行编码:

foo= pd.DataFrame({
'Col1' : ['B', 'A', 'B', 'C', 'B', 'A', 'C'],
'Val' : np.random.randn(7)
})
r=pd.factorize(foo['Col1'], sort=True)
foo['Col1'] = r[0]

产生以下正确结果(之前\之后):

  Col1       Val           Col1       Val
B 0.094336 1 0.094336
A -0.422168 0 -0.422168
B -0.750304 1 -0.750304
C 1.910625 2 1.910625
B 0.921890 1 0.921890
A 0.422612 0 0.422612
C -1.130780 2 -1.130780


print r
(array([1, 0, 1, 2, 1, 0, 2]), Index([u'A', u'B', u'C'], dtype='object'))

并且(由于“排序”)我还可以通过运行来构建键\值之间的映射函数 - 这是我的目标:

zip( np.unique(r[0]), r[1])
[(0, 'A'), (1, 'B'), (2, 'C')] # A became 0; B became 1 and so on...

我的问题是当我的数据集上有nan并且它们得到-1(这正是我想要的 - 它必须是-1):

foo= pd.DataFrame({
'Col1' : ['B', 'A', 'B', 'C', 'B', 'A', np.nan],
'Val' : np.random.randn(7)
})

r=pd.factorize(foo['Col1'], sort=True)
foo['Col1'] = r[0]


Col1 Val Col1 Val
B 1.397748 1 1.397748
A -1.011483 0 -1.011483
B 0.679650 1 0.679650
C 0.861900 2 0.861900
B -0.430241 1 -0.430241
A 1.472984 0 1.472984
NaN 0.549857 -1 0.549857

但是 pd.factorize 没有返回索引上的“nan”:

print r[1]
Index([u'A', u'B', u'C'], dtype='object')

现在我的映射功能不起作用:

zip( np.unique(r[0]), r[1])
Out[148]: [(-1, 'A'), (0, 'B'), (1, 'C')]

有什么方法可以让 pd.factorize 函数返回其索引对象上的 nan 吗?

谢谢

最佳答案

由于该列包含 float 的数据类型+ str由于 Nans 在其中存在于其中,pd.factorize分配值 -1(默认)后排除缺失值。

另一种方法是计算系列中存在的唯一值,然后将其转换为 categorical dtype 还为 Nans 分配值 -1通过它codes属性。

演示:

ser = pd.Series(foo['Col1'].unique(), dtype='category')
ser
Out[125]:
0 B
1 A
2 C
3 NaN
dtype: category
Categories (3, object): [A, B, C]

print(list(zip(ser, ser.cat.codes)))
#[('B', 1), ('A', 0), ('C', 2), (nan, -1)]

关于python - Nans on pd.factorize 返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422047/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com