2016-09-03 1 views
3

ФоновыйGroupBy/Сумма в Python панд - ноль на счету не показывает ... иногда

У меня есть набор данных в смоделированы популяции людей. Они имеют следующие атрибуты

  1. Возраст (0-120 лет)
  2. Пол (мужской, женский)
  3. расы (белый, черный, латиноамериканского, азиатского, другой)

DF. голова()

Age Race Gender in_population 
0 32  0  0    1 
1 53  0  0    1 
2 49  0  1    1 
3 12  0  0    1 
4 28  0  0    1 

Существует еще одна переменная, которая идентифицирует человека как «In_Population» *, который является булевой переменной. Я использую groupby in pandas для группировки населения возможных комбинаций из 3 атрибутов для вычисления таблицы подсчетов путем суммирования переменной «In_Population» в каждой возможной категории человека.

Существует 2 пола * 5 рас * 121 возраст = 1210 возможных групп, в которые попадет каждый человек в населении.

Если конкретная группа людей в конкретном году не имеет членов (например, 0-летний мужчина «другой»), то я все еще хочу, чтобы эта группа появлялась в моей группе - с помощью dataframe, но с нулем в сосчитать. Это происходит правильно в примере данных ниже (Age = 0, Gender = {0,1} и Race = 4). Там не было никаких «других» ноль-летних в данном

grouped_obj = df.groupby(['Age','Gender','Race']) 
groupedAGR = grouped_obj.sum() 
groupedAGR.head(10) 

       in_population 
Age Gender Race    
0 0  0    16 
      1     8 
      2    63 
      3     5 
      4     0 
    1  0    22 
      1     4 
      2    64 
      3    12 
      4     0 

Вопрос

Это происходит только для некоторых комбинаций половозрастной-Race. Иногда группы нулевой суммы пропускаются полностью. Ниже приведены данные в возрасте 45 лет. Я ожидал увидеть 0, что указывает на то, что в этом наборе данных нет 45-летних мужских «других» рас.

>>> groupedAGR.xs(45, level = 'Age') 
      in_population 
Gender Race    
0  0    515 
     1    68 
     2    40 
     3    20 
1  0    522 
     1    83 
     2    48 
     3    29 
     4     3 

Примечание

* «In_Population» В основном отфильтровывает «новорожденный» и «иммигрант», которые не являются частью соответствующего населения при расчете «смертности»; смертность в населении происходит до того, как иммиграция и роды случаются, поэтому я исключаю их из расчетов. У меня было подозрение, что это как-то связано с этим - у нулевых летних было нулевое количество очков, но у каждой другой возрастной группы вообще ничего не было показано ... но это не так.

>>> groupedAGR.xs(88, level = 'Age') 
      in_population 
Gender Race    
0  0    52 
     2     1 
     3     0 
1  0    62 
     1     3 
     2     5 
     3     3 
     4     1 

В населении нет 88-летних азиатских мужчин, поэтому в категории есть нуль. В населении нет 88-летних «других» мужчин, но они вообще не появляются.

EDIT: Я добавил в код, показывающий, как я делаю группу по объекту в пандах и как я суммирую, чтобы найти количество в каждой группе.

ответ

4

reindex Использование с заданным индексом и fill_value=0

ages = np.arange(21, 26) 
genders = ['male', 'female'] 
races = ['white', 'black', 'hispanic', 'asian', 'other'] 

sim_size = 10000 

midx = pd.MultiIndex.from_product([ 
     ages, 
     genders, 
     races 
    ], names=['Age', 'Gender', 'Race']) 

sim_df = pd.DataFrame({ 
     # I use [1:-1] to explicitly skip some age groups 
     'Age': np.random.choice(ages[1:-1], sim_size), 
     'Gender': np.random.choice(genders, sim_size), 
     'Race': np.random.choice(races, sim_size) 
    }) 

Они будут отсутствуют возрастные группы

counts = sim_df.groupby(sim_df.columns.tolist()).size() 
counts.unstack() 

enter image description here

Это заполняет недостающие возрастные группы

counts.reindex(midx, fill_value=0).unstack() 

enter image description here

+0

Спасибо! Это сработало! Есть ли способ сделать выход 1D? Я бы хотел увидеть только один столбец. –

+0

Кроме того, есть ли у вас какая-то интуиция, почему нули появлялись только иногда? А подмножества «нулевого подсчета» населения вообще не появлялись? –

+0

И мне нравится, как вы разместили изображение через ссылку imgur. Я открыл функцию «edit», чтобы увидеть, как вы это сделали. Очень круто. –

Смежные вопросы