Одновременная запись нескольких переменных в Pandas

1

У меня есть 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
Теги:
pandas
loops

2 ответа

2
Лучший ответ

Вы можете использовать iloc и replace с помощью dict т. iloc

df3.iloc[:,1:] = df3.iloc[:,1:].replace({'A':1,'B':2,'C':3,'D':4})
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 теперь полностью соответствуют pd.factorize...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню