Я создал уникальный фрейм данных уровня участника, который выглядит следующим образом:
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'])