我有一個包含 2 個分類列(col1、col2)的資料框。
col1 col2
0 A DE
1 A B
2 B BA
3 A A
4 C C
我想將唯一的字串值映射到整數,例如 (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
我曾嘗試使用因式分解或類別,但我沒有為兩列獲得相同的唯一值,從 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
uj5u.com熱心網友回復:
要跨列獲得相同的類別,您需要先重塑為單個維度。然后使用factorize并恢復原來的形狀。
這是一個使用stack/的示例unstack:
x = df.stack()
x[:] = x.factorize()[0]
df2 = x.unstack()
輸出:
col1 col2
0 0 1
1 0 2
2 2 3
3 0 0
4 4 4
加入原始資料:
x = df.stack()
x[:] = x.factorize()[0]
df2 = df.join(x.unstack().add_suffix('_cat'))
輸出:
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
按字母順序
如果你真的想要字母順序,你可以創建自己的自定義映射字典:
import numpy as np
cats = {k:v for v,k in enumerate(np.unique(df.values))}
df.replace(cats)
輸出:
col1 col2
0 0 4
1 0 1
2 1 2
3 0 0
4 3 3
uj5u.com熱心網友回復:
如果您對哪些代碼映射到哪些整數有偏好,我建議使用map,它接受一個字典,指定應該如何進行映射。
例子:
import pandas as pd
df = pd.DataFrame({'col1': ["A", "A", "B", "A" , "C"], 'col2': ["DE", "B", "BA", "A", "C"]})
mapping_dict = {'A':0, 'B':1, 'BA':2, 'C':3, 'DE':4}
df['ideal1'] = df['col1'].map(mapping_dict)
df['ideal2'] = df['col2'].map(mapping_dict)
print(df)
輸出:
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
@mozway 解決方案的優點是您不需要指定映射。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/406340.html
標籤:
上一篇:為什么日期格式不斷變化?
