熊猫如何在不寻常的文本顺序中进行分解

时间:2016-11-11 17:11:52

标签: python pandas categorical-data one-hot-encoding

我的数据框有一个'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.

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

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

自定义功能:

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

enter image description here