将 2 列中的唯一值映射到整数

Dav*_*d 8 5 python dataframe pandas

我有一个包含 2 个分类列(col1、col2)的数据框。

  col1 col2
0    A   DE
1    A    B
2    B   BA
3    A    A
4    C    C 
Run Code Online (Sandbox Code Playgroud)

我想将唯一字符串值映射到整数,例如(A:0,B:1,BA:2,C:3,DE:4)

  col1 col2  ideal1  ideal2
0    A   DE       0       4
1    A    B       0       1
2    B   BA       1       2
3    A    A       0       0
4    C    C       3       3
Run Code Online (Sandbox Code Playgroud)

我尝试使用分解或类别,但我没有为两列获得相同的唯一值,如 ROW C 所示:

这是我的代码:

df = pd.DataFrame({'col1': ["A", "A", "B", "A" , "C"], 'col2': ["DE", "B", "BA", "A", "C"]}) 

#ideal map alphabetical: A:0, B:1, BA:2, C:3, DE:4

 #ideal result 
df["ideal1"] = [0, 0, 1,0, 3]
df["ideal2"] = [4,1,2,0,3]


 #trial #1 --> C value 2 & 3 : not matching
df["cat1"] = df['col1'].astype("category").cat.codes
df["cat2"] = df['col2'].astype("category").cat.codes

 #trial #2 --> C value 2 & 4 : not matching 
df["fac1"] = pd.factorize(df["col1"])[0]
df["fac2"] = pd.factorize(df["col2"])[0]


 
print (df)

OUT: 

  col1 col2  ideal1  ideal2  cat1  cat2  fac1  fac2
0    A   DE       0       4     0     4     0     0
1    A    B       0       1     0     1     0     1
2    B   BA       1       2     1     2     1     2
3    A    A       0       0     0     0     0     3
4    C    C       3       3     2     3     2     4
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

要在各列中获得相同的类别,您需要首先将其重塑为单个维度。然后使用factorize并恢复原来的形状。

stack这是使用/的示例unstack

x = df.stack()
x[:] = x.factorize()[0]
df2 = x.unstack()
Run Code Online (Sandbox Code Playgroud)

输出:

  col1 col2
0    0    1
1    0    2
2    2    3
3    0    0
4    4    4
Run Code Online (Sandbox Code Playgroud)

连接到原始数据:

x = df.stack()
x[:] = x.factorize()[0]
df2 = df.join(x.unstack().add_suffix('_cat'))
Run Code Online (Sandbox Code Playgroud)

输出:

  col1 col2 col1_cat col2_cat
0    A   DE        0        1
1    A    B        0        2
2    B   BA        2        3
3    A    A        0        0
4    C    C        4        4
Run Code Online (Sandbox Code Playgroud)
按字母顺序

如果您确实想要按字母顺序排列,您可以创建自己的自定义映射字典:

import numpy as np
cats = {k:v for v,k in enumerate(np.unique(df.values))}
df.replace(cats)
Run Code Online (Sandbox Code Playgroud)

输出:

   col1  col2
0     0     4
1     0     1
2     1     2
3     0     0
4     3     3
Run Code Online (Sandbox Code Playgroud)