我的数据框有一个'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.
我一直在寻找方法,但没有找到任何东西。有没有办法做到这一点?
答案 0 :(得分:2)
考虑一个带有字符串列的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)