我有一个数据框,其中一些变量几乎具有相同的值。我需要重新编码。有没有比我想出的方法更有效的方法?例如,在下面的示例中,如果它们等于“ A”,“ B”,“ C”,“ D”,则需要将var3,var4和var10重新编码为1、2、3、4。
testdata = [{'var1' : 'A', 'var3' : 'B', 'var4' : 'C', 'var10' : 'C'},
{'var1' : 'C', 'var3' : 'D', 'var4' : 'A', 'var10' : 'B'},
{'var1' : 'D', 'var3' : 'B', 'var4' : 'B', 'var10' : 'A'}
]
df3 = pd.DataFrame(testdata)
cols = df3.columns[1:]
for c in cols:
df3[c][df3[c] == 'A'] = 1
df3[c][df3[c] == 'B'] = 2
df3[c][df3[c] == 'C'] = 3
df3[c][df3[c] == 'D'] = 4
答案 0 :(得分:2)
您可以使用iloc
即{p>使用replace
和dict
df3.iloc[:,1:] = df3.iloc[:,1:].replace({'A':1,'B':2,'C':3,'D':4})
答案 1 :(得分:1)
为完整起见,您可以stack
,然后替换为Series.map
。
repl_dict = {'A' : 1,'B' : 2,'C' : 3,'D' : 4}
(df3.set_index('var1')
.stack()
.map(repl_dict)
.unstack()
.reset_index()
)
var1 var10 var3 var4
0 A 3 2 3
1 C 2 4 1
2 D 1 2 2
或者,使用pd.factorize
:
v = df3.set_index('var1').stack()
v[:] = pd.factorize(v)[0] + 1
v.unstack().reset_index()
var1 var10 var3 var4
0 A 1 2 1
1 C 2 3 4
2 D 4 2 2
哪个绕过了对repl_dict
的需求,并扩展到数千个值。
当然,标签编码现在完全可以达到pd.factorize
了...