Я создал уникальный фрейм данных на уровне участников, который выглядит так:
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'])
@jpp Добавлен образец
Один из способов - использовать 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
Можете ли вы предоставить данные, которые мы можем использовать? Например, что такое
c1
,c2
и т. д.? Каков ваш желаемый результат?