Я пытаюсь найти элегантный способ пометить кодирование нескольких столбцов в кадре данных Pandas с одним и тем же кодировщиком. Предположим, у меня есть два столбца, которые соответствуют командам из двух видов спорта, играющим в матче.
Решение, которое работает для меня, состоит в том, чтобы взять эти два столбца, преобразовать их в массив numpy
, сгладить их, закодировать, а затем разгладить и вставить обратно в фрейм данных. Однако это кажется более сложным, чем должно быть, особенно при использовании комбинации pandas
+scikitlearn
.
.
Буду рад всем решениям, заранее спасибо!
P.S. Я хочу что-то похожее на тот же общий кодировщик для столбцов, но я не хочу устанавливать внешнюю библиотеку только для этого .
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ: я пробовал этот пример, предложенный Бен Райнигер, но это не то, чего я хочу. Более конкретно:
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
data = pd.DataFrame({'Name':['Tom', 'Jack', 'Steve', 'Ricky'],
'Name1':['Mary','Tom', 'Ricky', 'Steve'],})
oe = OrdinalEncoder()
t_data = oe.fit_transform(data)
В результате я получаю следующее:
[[3. 0.]
[0. 3.]
[2. 1.]
[1. 2.]]
Для данных:
<table border="1" class="dataframe">\n <thead>\n <tr style="text-align: right;">\n <th></th>\n <th>Name</th>\n <th>Name1</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Tom</td>\n <td>Mary</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Jack</td>\n <td>Tom</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Steve</td>\n <td>Ricky</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Ricky</td>\n <td>Steve</td>\n </tr>\n </tbody>\n</table>'
Итак, как вы можете видеть, Джек и Мэри закодированы как число - 0.0. Это означает, что кодировщик берет все столбцы по отдельности.
Результат, который я хотел бы получить для этого примера, кодирует все столбцы, как если бы они были одним:
Jack - 0
Mary - 1
Ricky - 2
Steve - 3
Tom - 4
Хотя Джек встречается только в первом столбце, а Мэри во втором.
Результирующий массив должен выглядеть следующим образом:
[[4. 1.]
[0. 4.]
[3. 2.]
[2. 3.]]
В идеале он должен оставаться pandas dataframe
.
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ 2: мой текущий код, который работает для меня, и я хочу его оптимизировать, выглядит следующим образом:
# data is Pandas dataframe
data = data.to_numpy()
X = data[:, [3, 4]] # I choose the columns that I want to encode
X = X.flatten()
label_encoder = LabelEncoder()
X = label_encoder.fit_transform(X)
data[:, [3, 4]] = np.reshape(X, (-1, 2))
data = pd.DataFrame(data=data, columns=names)