Код: Выделить всё
import pandas as pd
d1 = str([{"Alice": "1/2"}, {"Bob": "3/11"}, {"Charlotte": "5/2"}])
d2 = str([{"Bob": "2/7"}, {"Daniel": "4/5"}])
d3 = str([{"Emily": "12/5"}])
d4 = str([{"Bob": "4/11"}, {"Victor": "2/2"}, {"Bob": "5/6"}])
df = pd.DataFrame([d1, d2, d3, d4], columns=['visits'])
Код: Выделить всё
df_desired = pd.DataFrame(
[[d1, 1, 1, 1, 0, 0, 0],
[d2, 0, 1, 0, 1, 0, 0],
[d3, 0, 0, 0, 0, 1, 0],
[d4, 0, 2, 0, 0, 0, 1]],
columns=['visits', 'Alice', 'Bob', 'Charlotte', 'Daniel', 'Emily', 'Victor'])
РЕДАКТИРОВАТЬ: Я придумал решение, которое, казалось, работало, но был бы признателен за совет о том, как его можно улучшить.
Несколько комментаторов спросили, почему словари хранятся в виде строк. Я сделал это, потому что (1) именно так он хранится в моем наборе данных и (2) иногда Pandas выдает исключения, когда я пытаюсь использовать нехешируемые типы данных, поэтому я хотел предотвратить это.
Мое решение было следующим:
Код: Выделить всё
def get_patient_list():
"""This function returns a list of all the patient names
appearing in the visits column."""
patient_list = []
def fn1(row):
visits_list = eval(row['visits'])
for visit in visits_list:
for name in visit.keys():
if name not in patient_list:
patient_list.append(name)
df.apply(fn1, axis=1)
return patient_list
# Now that I have a list of all the patients, I can make a column for
# each patient, and just count for each row how many times that
# patient visited.
for patient in get_patient_list():
def visits_counter(row):
visits_list = eval(row['visits'])
counter = 0
for visit in visits_list:
if patient in visit.keys():
counter += 1
return counter
df[patient] = df.apply(visits_counter, axis=1)