代码之家  ›  专栏  ›  技术社区  ›  DVL

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

  •  2
  • DVL  · 技术社区  · 8 年前

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

    我想使用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 回复  |  直到 8 年前
        1
  •  3
  •   Nickil Maveli    8 年前

    考虑 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