у меня есть большой файл CSV с двумя строками в строке в таком виде:Как ускорить LabelEncoder до перекодировки категориальной переменной в целые
g,k
a,h
c,i
j,e
d,i
i,h
b,b
d,d
i,a
d,h
Я прочитал в первых двух столбцах и перекодировать строки в целых чисел следующим образом :
import pandas as pd
df = pd.read_csv("test.csv", usecols=[0,1], prefix="ID_", header=None)
from sklearn.preprocessing import LabelEncoder
# Initialize the LabelEncoder.
le = LabelEncoder()
le.fit(df.values.flat)
# Convert to digits.
df = df.apply(le.transform)
Этот код от https://stackoverflow.com/a/39419342/2179021.
Код работает очень хорошо, но медленный, когда df большой. Я приурочил каждый шаг, и результат был неожиданным для меня.
pd.read_csv
занимает около 40 секунд.le.fit(df.values.flat)
занимает около 30 секундdf = df.apply(le.transform)
занимает около 250 секунд.
Есть ли способ ускорить этот последний шаг? Похоже, это должен быть самый быстрый шаг для всех!
Больше тайминги для шага перекодировки на компьютере с 4 ГБ оперативной памяти
Ответ ниже по maxymoo быстро, но не дает правильный ответ. Принимая пример CSV из верхней части вопроса, он переводит его на:
0 1
0 4 6
1 0 4
2 2 5
3 6 3
4 3 5
5 5 4
6 1 1
7 3 2
8 5 0
9 3 4
Обратите внимание, что «d» отображается 3 в первой колонке, но 2 во втором.
Я попробовал решение от https://stackoverflow.com/a/39356398/2179021 и получил следующее.
df = pd.DataFrame({'ID_0':np.random.randint(0,1000,1000000), 'ID_1':np.random.randint(0,1000,1000000)}).astype(str)
df.info()
memory usage: 7.6MB
%timeit x = (df.stack().astype('category').cat.rename_categories(np.arange(len(df.stack().unique()))).unstack())
1 loops, best of 3: 1.7 s per loop
Тогда я увеличил размер dataframe на коэффициент 10.
df = pd.DataFrame({'ID_0':np.random.randint(0,1000,10000000), 'ID_1':np.random.randint(0,1000,10000000)}).astype(str)
df.info()
memory usage: 76.3+ MB
%timeit x = (df.stack().astype('category').cat.rename_categories(np.arange(len(df.stack().unique()))).unstack())
MemoryError Traceback (most recent call last)
Этот метод, как представляется, использовать столько оперативной памяти, пытаясь перевести эту относительно небольшую dataframe, что он выходит из строя.
Я также приурочил LabelEncoder к более крупному набору данных с 10 миллионами строк. Он работает без сбоев, но только линия подгонки заняла 50 секунд. Шаг df.apply (le.transform) занял около 80 секунд.
Как я могу:
- Получить что-то примерно скорости ответа maxymoo в и примерно использование памяти LabelEncoder, но что дает правильный ответ, когда dataframe имеет две колонки.
- Храните сопоставление, чтобы я мог повторно использовать его для разных данных (как это может сделать LabelEncoder)?
Как велика ваша CSV - строк и столбцов? Сколько у вас le.class? – wwii
@wwii Около 10 миллионов строк и 1 млн. Le.classes. – eleanora
Что делает '' 'groupby ....' '' выполнить? – wwii