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