Python pandas - объединение с перекрытием нескольких уровней в мультииндексе не реализовано - PullRequest
0 голосов
/ 28 ноября 2018

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

Столбцы, содержащиеся в этом наборе данных:

['stop_id', 'stop_date', 'officer_id', 'driver_gender', 'driver_age', 'driver_race', 'ethnicity', 'violation', 'is_arrested', 'stop_outcome','stop_year', 'stop_month', 'stop_season', 'age_category', 'arrest_or_citation'].

Иdf выглядит так (я скопировал первые 15 строк): df [: 15]

stop_id  stop_date        ...         age_category arrest_or_citation
 0   2168033 2004-05-29        ...          middle_aged              False
 1   4922383 2009-09-04        ...          young_adult              True
 2   5109631 2009-12-23        ...          middle_aged              True
 3   924766 2001-08-13        ...                adult               True
 4   2293870 2004-09-25        ...          middle_aged               True
 5   2294412 2004-09-26        ...          young_adult               True
 6   6224320 2011-05-11        ...          young_adult               True
 7   2773342 2006-01-30        ...          middle_aged              False
 8   8559541 2014-05-25        ...             juvenile               True
 9   9089078 2015-04-01        ...          middle_aged               True
 10    58220 2000-02-09        ...                adult               True
 11  7449910 2012-10-30        ...          middle_aged               True
 12  9229308 2015-06-15        ...          young_adult               True
 13  4257690 2008-08-24        ...          young_adult               True
 14  3964626 2008-03-27        ...                adult               True
 15  8017683 2013-08-13        ...          middle_aged               True

 [15 rows x 15 columns]

Например, я пытаюсь сгруппировать по ['age_category', 'driver_gender'] и получить долю каждой группыв 'is_arrested'].Кадр данных, к которому я должен прийти, должен выглядеть следующим образом:

 is_arrested                    False     True
 age_category driver_gender
 juvenile     F              0.994462  0.005538
              M              0.984669  0.015331
 young_adult  F              0.990855  0.009145
              M              0.979265  0.020735
 adult        F              0.991970  0.008030
              M              0.983174  0.016826
 middle_aged  F              0.995749  0.004251
              M              0.989827  0.010173
 senior       F              0.998697  0.001303
              M              0.995823  0.004177

Однако я не могу этого сделать.Я попытался:

 size_per_group = df.groupby(['age_category', 'driver_gender'])['is_arrested'].size()

 size_per_group_outcome = df.groupby(['age_category', 'driver_gender', 'is_arrested'])['is_arrested'].size()

 df_share = size_per_group_putcome/size_per_group

Но это приводит к:

 NotImplementedError: merging with more than one level overlap on a multi-index is not implemented

Я не могу это исправить, и был бы признателен за любую помощь в этом!Большое вам спасибо!

1 Ответ

0 голосов
/ 28 ноября 2018

Вы были почти там, я думаю, что вам просто нужно использовать .mean() в этом случае, что даст вам% раз arrested был True.Краткий пример:

import pandas as pd
import numpy as np

n = 1000

data = pd.DataFrame(
    {
        'age': np.random.choice(['young_adult', 'middle_aged', 'adult', 'juvenile'], n),
        'gender': np.random.choice(['M', 'F'], n),
        'arrested': np.random.rand(n) > .95
    }
)

print(data.groupby(['age', 'gender'])['arrested'].mean())

age          gender
adult        F         0.065421
             M         0.042254
juvenile     F         0.024390
             M         0.055172
middle_aged  F         0.019417
             M         0.064516
young_adult  F         0.029851
             M         0.016393

Чтобы получить счетчик частот в случаях True и False (кажется немного избыточным, но в любом случае), вы можете использовать .crosstab() с нормализацией индекса:

pd.crosstab([data['age'], data['gender']], data['arrested'], normalize = 'index')

Дача:

arrested               False     True 
age         gender                    
adult       F       0.965986  0.034014
            M       0.950000  0.050000
juvenile    F       0.945312  0.054688
            M       0.900901  0.099099
middle_aged F       0.934579  0.065421
            M       0.942857  0.057143
young_adult F       0.966942  0.033058
            M       0.936508  0.063492

Примечание: результаты двух подходов не совпадают, так как я восстановил случайные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...