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)
要在各列中获得相同的类别,您需要首先将其重塑为单个维度。然后使用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)
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |