南斯开pd.因子分解返回对象

2024-04-16 20:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]

将生成以下正确结果(before\after):

^{pr2}$

而且(由于“sort”),我还可以通过运行来构建key\value之间的映射函数-这是我的目标:

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.因子分解不返回索引上的“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.因子分解函数是否返回其索引对象的nan?在

谢谢


Tags: 数据truedataframefoonprandomvalnan
2条回答

如果您可以保证r[0]-1的唯一原因是数据集中的np.nan,那么可以使用以下函数获得所需的映射:

def get_mapping(r):
    if -1 in r[0]:
         return zip( np.unique(r[0]), r[1].insert(0, np.nan) )
    else:
         return zip( np.unique(r[0]), r[1] )

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

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

演示:

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)]

相关问题 更多 >