一次重新编码Pandas中的多个变量

时间:2018-06-21 06:17:21

标签: python pandas loops

我有一个数据框,其中一些变量几乎具有相同的值。我需要重新编码。有没有比我想出的方法更有效的方法?例如,在下面的示例中,如果它们等于“ 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

2 个答案:

答案 0 :(得分:2)

您可以使用iloc即{p>使用replacedict

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了...