Проблемы с одновременным появлением данных с использованием маски и продукта MultiIndex.from? - PullRequest
0 голосов
/ 19 июня 2020

Я все еще изучаю 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()

Надеюсь, это имело смысл. Буду признателен, если вы поможете мне с этим и покажете, что я делаю неправильно, или предложите лучшую альтернативу. Кроме того, извините за то, что написал слишком много, я подумал, что может помочь, если я мысленно мыслю контекстом.

Всем спасибо.

...