pandas.factorize 整个数据框

新手上路,请多包涵

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

但是我怎样才能轻松有效地转换数据框的许多列呢?反向映射步骤呢?

示例:此数据框包含带有字符串值的列,例如“type 2”,我想将其转换为数值 - 并可能稍后将它们转换回来。

在此处输入图像描述

原文由 clstaudt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 504
2 个回答

您可以使用 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

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

我还发现这个答案很有帮助: https ://stackoverflow.com/a/20051631/4643212

我试图从 Pandas DataFrame 中的现有列(名为“SrcIP”的 IP 地址列表)中获取值,并将它们映射到新列(在此示例中名为“ID”)中的数值。

解决方案:

 df['ID'] = pd.factorize(df.SrcIP)[0]

结果:

         SrcIP | ID
192.168.1.112 |  0
192.168.1.112 |  0
192.168.4.118 |  1
192.168.1.112 |  0
192.168.4.118 |  1
192.168.5.122 |  2
192.168.5.122 |  2
...

原文由 Gabe F. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏