Пакетные пустые переменные столбцы в пандах - PullRequest
0 голосов
/ 02 мая 2018

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

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

Значения codes являются наборами. Я пытаюсь получить некоторые корреляции между отдельными кодами и стоимостью, чтобы в конечном итоге построить прогнозную модель, используя некоторые другие функции, которые у меня есть. За пределами Панд я создал 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.

EDIT: Коды являются диагностическими кодами, поэтому они имеют значения, такие как 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'])

1 Ответ

0 голосов
/ 02 мая 2018

Одним из способов является использование 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
...