У меня есть dataframe, где некоторые переменные в значительной степени имеют одинаковые значения. Мне нужно их перекодировать. Есть ли более эффективный способ, чем то, с чем я столкнулся? Например, в приведенном ниже примере мне нужно перекодировать var3, var4 и var10 в 1, 2, 3, 4, если они равны "A", "B", "C", "D".
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
Вы можете использовать iloc
и replace
с помощью dict
т. iloc
df3.iloc[:,1:] = df3.iloc[:,1:].replace({'A':1,'B':2,'C':3,'D':4})
Для полноты вы можете 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
теперь полностью соответствуют pd.factorize
...