Я все еще изучаю pandas и его многочисленные возможности, поэтому буду признателен за помощь с этой проблемой. Я пытаюсь создать маску, найдя пересечение двух событий и используя эту маску, чтобы помочь мне сгруппировать два моих события и объединить их, чтобы определить частоту их появления, используя MultiIndex.from_product. Тем не менее, я борюсь, поскольку мое ядро умирает (я использую ноутбук Jupyter). Я не понимаю, почему так происходит.
Чтобы дать вам некоторый контекст.
Это маска, которую я использую
# Create a mask such that we can see whether the codes in df['Diseases'] are in (isin) the
# list, df_diseases and whether the codes in df['Diseases'] are in (isin) the list
# df_rest_diseases. I am using the intersection (& = and).
m_intersect = (df['Diseases'].isin(df_diseases) & df['Diseases'].isin(df_rest_diseases))
Итак, df_diseases
- это список длиной 26, а df_rest_diseases
- это список длиной 6815278, который исключил все повторяющиеся коды df_diseases . Поскольку исходная длина была 6857919.
Когда я запускаю маску, она работает плавно. Однако после того, как я применил свой следующий код, в котором я применяю свою маску, группировку, агрегирование и мультииндексирование, он дает сбой, то есть ядро дает сбой.
# Filter the rows with this mask by grouping the two columns and aggregating on the Counts column, to get count and
# sum. To find all the possible combinations from our list, reindex with MultiIndex.from_product of the two lists.
df_cocurr_dis_intersect = (df[m_intersect].groupby(['Diseases'])
['Counts'].agg(['count','sum'])
.reindex(pd.MultiIndex.from_product([df_diseases, df_rest_diseases],
names=['Diseases_str', 'All Remaining Diseases_str']),
fill_value=0)
.reset_index()
)
После того, как я применил это, требуется некоторое время, после чего ядро останавливается из-за сбоя.
Кроме того, df
- это фрейм данных формы (6857919, 5) со столбцами (Diseases, Symptoms, Counts, Diseases_str, Symptoms_str). Вот проблеск первых 5 строк df:
Diseases Symptoms Counts Disease All Remaining Diseases
0 4078261 4402095 132 hypertrophy emotional distress
1 4012540 4244984 783 mannitol coughing
2 4020026 4043199 181 pneumonia panic attack
3 4416271 4775378 270 heart attack creatinine
4 4016720 4632960 1184 stroke fever
Кроме того, df_diseases
- это список, вот проблеск этого,
df_diseases = [4020026, 4416271, 4001297, 4001605, 4001951, 4002988,...]
И, df_rest_diseases
это более длинный список, вот вам его представление,
df_rest_diseases = [4125384, 4499620, 4542258, 4849326, ....]
Причина, по которой я использую маску и подход мультииндексирования, заключается в том, что я могу получить что-то вроде следующего:
Diseases Count Sum Diseases_str All Remaining Diseases_str
0 4020026 1 0 pneumonia emotional distress
1 4020026 3 480 pneumonia coughing
2 4020026 1 181 pneumonia panic attack
3 4020026 24 33840 pneumonia creatinine
4 4020026 7 400 pneumonia fever
Просто для вашего интереса я получил df_rest_diseases
следующим образом:
df_rest_diseases = [x for x in df_all_diseases if x not in df_diseases]
Итак, df_all_diseases
- это список длиной 6857919. После применения вышеуказанного кода я могу удалить все df_diseases
из df_all_diseases
, Я получаю оставшиеся коды, df_rest_diseases
длиной 6815278.
Наконец, для дальнейшего контекста, df_all_diseases
- это список, полученный из фрейма данных df
следующим образом:
df_all_diseases = df['Diseases'].to_list()
Надеюсь, это имело смысл. Буду признателен, если вы поможете мне с этим и покажете, что я делаю неправильно, или предложите лучшую альтернативу. Кроме того, извините за то, что написал слишком много, я подумал, что может помочь, если я мысленно мыслю контекстом.
Всем спасибо.