Пакетное заполнение столбцов фиктивных переменных в пандах

Я создал уникальный фрейм данных на уровне участников, который выглядит так:

memberid      codes       cost
memberA       {c1, c2}    100.0
memberB       {c2, c3}    120.0
memberC       {c1, c5}    200.0

Значения codes установлены. Я пытаюсь получить некоторую корреляцию между отдельными кодами и стоимостью, чтобы в конечном итоге построить прогнозную модель с использованием некоторых других функций, которые у меня есть. Помимо Pandas, я создал Counter(), который отсортировал коды по распространенности:

all_codes = []
for entry in df['codes'].values:
    for code in entry:
        all_codes.append(code)

common_code_info = Counter(all_codes).most_common()
common_codes = [el[0] for el in common_code_info]

Всего в common_codes около 500 кодов, и я хотел бы создать такое же количество фиктивных переменных, но я не уверен, как это сделать в Pandas. Я пробовал что-то вроде:

for code in common_codes:
    if code in df['codes'].values:
        df['has_'+code] = 1
    else:
        df['has_'+code] = 0

но это не сработало (все фиктивные столбцы - нули). Есть ли простой способ заполнить эти фиктивные столбцы, поскольку get_dummies нельзя использовать, потому что «источник» потенциальных фиктивных переменных находится за пределами фрейма данных? Если нет более простого способа сделать все, что я ищу, просто используя Pandas.

Обновлено: Коды являются диагностическими кодами, поэтому они имеют такие значения, как C801, R911 и т. д. Результирующий фрейм данных должен выглядеть так:

memberid      codes       cost    has_c1    has_c2    has_c3
memberA       {c1, c2}    100.0   1         1         0
memberB       {c2, c3}    120.0   0         1         1
memberC       {c1, c5}    200.0   1         0         0

Я также пробовал:

for code in common_codes:
    df['has_'+code] = np.where(code in df['codes'], 1, 0)

но это тоже не сработало.

Код для образца фрейма данных:

data = {'memberid': ['memberA', 'memberB', 'memberC'], 
        'codes': [{c1, c2}, {c2, c3}, {c1, c5}], 
        'cost': [100.0, 120.0, 200.0]}
df = pd.DataFrame(data, columns = ['memberid', 'codes', 'cost'])

Можете ли вы предоставить данные, которые мы можем использовать? Например, что такое c1, c2 и т. д.? Каков ваш желаемый результат?

jpp 02.05.2018 00:13

@jpp Добавлен образец

nvergos 02.05.2018 00:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
412
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов - использовать pd.get_dummies.

Небольшая сложность заключается в том, что вам нужно сначала преобразовать set в list, поскольку для get_dummies требуется упорядоченная коллекция.

import pandas as pd

data = {'memberid': ['memberA', 'memberB', 'memberC'], 
        'codes': [{'c1', 'c2'}, {'c2', 'c3'}, {'c1', 'c5'}], 
        'cost': [100.0, 120.0, 200.0]}

df = pd.DataFrame(data, columns = ['memberid', 'codes', 'cost'])

dummies = pd.get_dummies(df['codes'].apply(list).apply(pd.Series).stack()).sum(level=0)

res = df.join(dummies)

print(res)

  memberid     codes   cost  c1  c2  c3  c5
0  memberA  {c2, c1}  100.0   1   1   0   0
1  memberB  {c2, c3}  120.0   0   1   1   0
2  memberC  {c5, c1}  200.0   1   0   0   1

Другие вопросы по теме