pandas.factorize 将输入值编码为枚举类型或分类变量。

但是,如何轻松高效地转换数据帧的许多列呢?反向映射步骤呢?

示例:此数据框包含带有字符串值(例如“类型2”)的列,我希望将其转换为数值-并可能在以后将其转换回去。

python - pandas.factorize整个数据框-LMLPHP

最佳答案

如果需要分别对每一列进行apply,则可以使用factorize:

df = pd.DataFrame({'A':['type1','type2','type2'],
                   'B':['type1','type2','type3'],
                   'C':['type1','type3','type3']})

print (df)
       A      B      C
0  type1  type1  type1
1  type2  type2  type3
2  type2  type3  type3

print (df.apply(lambda x: pd.factorize(x)[0]))
   A  B  C
0  0  0  0
1  1  1  1
2  1  2  1

如果需要相同的字符串值和相同的数字:
print (df.stack().rank(method='dense').unstack())
     A    B    C
0  1.0  1.0  1.0
1  2.0  2.0  3.0
2  2.0  3.0  3.0

如果只需要对某些列应用此功能,请使用一个子集:
df[['B','C']] = df[['B','C']].stack().rank(method='dense').unstack()
print (df)
       A    B    C
0  type1  1.0  1.0
1  type2  2.0  3.0
2  type2  3.0  3.0

factorize 解决方案:
stacked = df[['B','C']].stack()
df[['B','C']] = pd.Series(stacked.factorize()[0], index=stacked.index).unstack()
print (df)
       A  B  C
0  type1  0  0
1  type2  1  2
2  type2  2  2

可以通过map通过 dict 将它们翻译回去,在这里您需要通过 drop_duplicates 删除重复项:
vals = df.stack().drop_duplicates().values
b = [x for x in df.stack().drop_duplicates().rank(method='dense')]

d1 = dict(zip(b, vals))
print (d1)
{1.0: 'type1', 2.0: 'type2', 3.0: 'type3'}

df1 = df.stack().rank(method='dense').unstack()
print (df1)
     A    B    C
0  1.0  1.0  1.0
1  2.0  2.0  3.0
2  2.0  3.0  3.0

print (df1.stack().map(d1).unstack())
       A      B      C
0  type1  type1  type1
1  type2  type2  type3
2  type2  type3  type3

关于python - pandas.factorize整个数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39390160/

10-12 16:42