2

我有一个数据框,其中有一列“cat100”,其值如下:

'A' 'B' ... 'Y' 'Z' 'AA' 'AB' ...

我想使用 pd.factorize 对列进行因式分解,使 AA 在“B”“C”...“Z”之后。

我试过类似的东西:

df = pd.DataFrame(['A','B','AA'])
df[0] = pd.factorize(df[0], sort=True)[0]

但这会将 A 分配给 0,将 B 分配给 2,将 AA 分配给 1。我希望将 AA 分配给 2,将 B 分配给 1。

我已经寻找方法来做到这一点,但没有找到任何东西。有没有办法做到这一点?

4

1 回答 1

3

考虑DF带有字符串列的 a,如下所示:

df = pd.DataFrame(dict(col=['A','B','AA','C','BB','AAA','BC','AB','AA']))
df

在此处输入图像描述

自定义功能:

(i) 从正在考虑的列中获取唯一条目。
(ii)Groupby按字符串长度并按字典顺序对它们进行排序并水平堆叠。
(iii) 分解它们。

def complex_factorize(df, col):
    ser = pd.Series(df[col].unique())
    func = lambda x: sorted(x.values.ravel())
    arr = np.hstack(ser.groupby(ser.str.len()).apply(func).values)
    return pd.factorize(arr)

factorize获取该方法返回的序列的标签和唯一元素,将其提供DF.replace给构建映射。

val, ser = complex_factorize(df, 'col')
df.replace(ser, val)

在此处输入图像描述

于 2016-11-11T19:16:38.797 回答