Анализ данных в пандах, где некоторые значения являются списками диктов - PullRequest
0 голосов
/ 26 апреля 2018

Мне дали тупой CSV с примерно 20 000 строк данных, относящихся только к ~ 300 случаям, поэтому я хотел попробовать сгруппировать вещи так, чтобы это имело больший смысл, поэтому у меня теперь есть текстовый файл с 300 случаями, образец двух из них ниже:

[{"Обработка": [""], "Год": "2004", "Причина": "Преднамеренное / предполагаемое самоубийство", "CaseNumber": "9999", "OutCome": "Незначительный эффект", «Симптомы»: [«Сонный / вялый / связанный»], «case_drugs»: [{«Substance»: «RIVOTRIL», «Poisindex_Desc»: «BENZODIAZEPINE», «SubstanceFormula_20c»: «LIQUID», «SubstanceProductCode:» "," RouteExp ":" INGEST "," SubstanceGeneric_AAPCC_Code ":" 999 "}, {" Substance ":" HYDROMORPHONE X 15 SYRINGES 6 MG EA "," Poisindex_Desc ":" HYDROMORPHONE "," SubstanceForm ": L_ "SubstanceProductCode": "9999", "RouteExp": "INGEST", "SubstanceGeneric_AAPCC_Code": "9999"}], "Acuity": "Acute", "AgeGroup": "90-99 лет", "SEX": " Зойдберг "},
{"Обработка": ["Активированный уголь однократной дозы", "Жидкости для внутривенных вливаний"], "Год": "2006", "Причина": "Непреднамеренный / общий", "CaseNumber": "8888", "OutCome": " Возможны минимальные клинические эффекты "," Симптомы ": [" "]," case_drugs ": [{" Substance ":" LOPERAMIDE 2MG X 1/2 "," Poisindex_Desc ":" LOPERAMIDE "," SubstanceFormula_20c ":" SOLID (ТАБЛЕТКИ) / CAPSULES / CAPLETS) "," SubstanceProductCode ":" 88 "," RouteExp ":" INGEST "," SubstanceGeneric_AAPCC_Code ":" 88 "}]," Acuity ":" Acute "," AgeGroup ":" L5 yrs ", "SEX": "F"}]

Что-то вроде «Год» имеет только 1 значение для каждого случая. «Симптомы» имеют список значений, а «case_drugs» имеет список слов. Этот формат имеет для меня большой смысл, поскольку у одного человека может быть несколько препаратов, и у каждого препарата есть несколько атрибутов, связанных с ним. На самом деле я не хочу сглаживать данные, потому что в переменной с данными о наркотиках не существует максимального количества записей, поэтому возможно, что если у меня будет значение «препарат1, препарат2, препарат3», то в следующий раз, когда я получу данные, придется добавить «drug4».

В настоящее время я могу загрузить файл в панды и проанализировать большую его часть. Что касается значений списка, я наткнулся на другой пост обмена стека, в котором предлагалось использовать это:

df['Symptoms'].apply(lambda x: pd.Series(x).value_counts()).sum()

Это прекрасно работает. Я уверен, что могу выяснить, как сделать другой анализ с помощью аналогичного метода. Я до сих пор не уверен, как я буду анализировать переменную case_drugs. Я могу создавать свои собственные функции для циклического просмотра и чтения данных, но мне было интересно, есть ли в пандах существующая функциональность, которая сможет это сделать. Например, что если бы я хотел посчитать, сколько раз RIVOTRIL показывался в значении «вещество» переменной «case_drugs»?

Или, если вы считаете, что мне лучше хранить данные другим способом, это также будет приемлемым ответом!

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2018

Для переменной case_drugs один из способов сделать это - создать для нее другой фрейм данных.

df_case_drugs = pd.DataFrame(df['case_drugs'].values[0])
df_case_drugs['Substance'].value_counts()
>>>
RIVOTRIL                               1
HYDROMORPHONE X 15 SYRINGES 6 MG EA    1

Обновление : Создание кадра данных, который включает все записи в case_drugs.

Я бы сначала разделил (взорвал) список диктов в case_drugs на его собственную строку и использовал CaseNumber в качестве индекса.

df_case_drugs = pd.DataFrame(df['case_drugs'].tolist(), index=df['CaseNumber']).stack()
df_case_drugs = df_case_drugs.reset_index()

Это дает вам фрейм данных с одним dict на строку в столбце с именем 0. (Вы можете переименовать столбец, но мы не сохраняем этот столбец, так что это на самом деле не имеет значения.)

Затем преобразуйте данные в кадр данных.

df_case_drugs = pd.concat([df_case_drugs['CaseNumber'], 
    pd.DataFrame(df_case_drugs[0].tolist())], axis=1)

Значения счетчика:

df_case_drugs['Substance'].value_counts()
>>>
RIVOTRIL                               1
LOPERAMIDE 2MG X 1/2                   1
HYDROMORPHONE X 15 SYRINGES 6 MG EA    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...