Pandas 如何分解不寻常的文本顺序

Pandas how to Factorize in Unusual Text Order

我有一个数据框,其中有一列 '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。

我已经搜索过执行此操作的方法,但没有找到任何方法。有办法吗?

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

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)