У меня есть фрейм данных панд (X11), как это: На самом деле у меня есть 99 столбцов до dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Я хочу создать дополнительный столбец (столбцы) для значений ячеек, таких как 25041,40391,5856 и т. Д. Таким образом, будет столбец 25041 со значением 1 или 0, если 25041 встречается в этой конкретной строке в любых столбцах dxs. Я использую этот код, и он работает, когда количество строк меньше.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Я получаю результат, как это:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Когда количество строк исчисляется многими тысячами или миллионами, оно зависает и длится вечно, и я не получаю никакого результата. Обратите внимание, что значения ячеек не являются уникальными для столбца, а повторяются в нескольких столбцах. Например, 40391 встречается в dx1, а также в dx2 и т. Д. Для 0 и 5856 и т. Д. Есть идеи, как улучшить логику, упомянутую выше?
Ответы:
В пандах гораздо более питонное решение ...
Это займет менее секунды на 10 миллионов строк на моем ноутбуке:
Вот детали, изложенные:
Простой маленький фрейм данных -
Метод бинаризации -
Dataframe с 10 миллионами строк -
Временная бинаризация (так называемое «горячее кодирование») на 10-миллионном кадре данных -
Надеюсь это поможет!
источник
Похоже, вы хотите создать фиктивную переменную из столбца pandas dataframe. К счастью, панды имеют специальный метод для этого:
get_dummies()
. Вот фрагмент кода, который вы можете адаптировать под свои нужды:Вот вывод
data_transformed
:источник