Считать по группам в двух столбцах в Pandas не включает группы с нулевым счетом

1

Я группируюсь по двум столбцам в Pandas DataFrame, после чего я подсчитываю размер каждой группы. Затем этот сгруппированный DataFrame будет отфильтрован и данные будут отображены на гистограмме.

Проблема, с которой я сталкиваюсь, заключается в том, что если группа имеет нулевой счет, она не отображается в DataFrame и поэтому не отображается на графике. Таким образом, график имеет недостающие категории по оси x, когда я предпочел бы, чтобы они включали категорию, даже если нет отображения бара (т.е. Представляют категорию как ноль, тем самым делая график более представительным для данных в целом).

# Import the required packages.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Set the appearance of plots.
plt.style.use('ggplot')

# Create sample DataFrame.
data = {'ID':[1, 2, 3, 4, 5, 6, 7], 'Name':['Tom', 'Jack', 'Anne', 'Steve', 'Ricky', 'Jane', 'Beth'], 'Age':[28,34,29,42,15,10,26], 'Voted':[0, 1, 0, 1, 1, 0, 0]}
df = pd.DataFrame(data)

# Bin into age groups and create an Age Group column in the DataFrame.
bins = list(range(0, 60, 10))
df['Age Group'] = pd.cut(df['Age'], bins, right=False)

# Group data by Age Group and Voted columns. Then perform count using the ID column. Make Age Group the new index.
groups = df.groupby(['Age Group', 'Voted'])
new_df = groups.agg({'ID': 'count'}).rename(columns={'ID':'Count'})    
new_df.reset_index(inplace=True)
new_df.set_index('Age Group', inplace=True)
new_df

Вышеприведенный код выводит следующее:

         Voted  ID
Age Group       
[10, 20)    0   1
[10, 20)    1   1
[20, 30)    0   3
[30, 40)    1   1
[40, 50)    1   1

Я хотел бы получить что-то вроде результата ниже, из которого я могу отфильтровать только проголосовавшие = 1 возрастные группы и график в диаграмме:

         Voted  ID
Age Group
[0, 10)     0   0
[0, 10)     1   0       
[10, 20)    0   1
[10, 20)    1   1
[20, 30)    0   3
[20, 30)    1   0
[30, 40)    0   0
[30, 40)    1   1
[40, 50)    0   0
[40, 50)    1   1  

Я искал похожие вопросы/результаты (наиболее относительный ниже), но я не могу заставить себя работать.

[ Pandas groupby для нулевых значений [ Pandas Groupby Как показать нулевые подсчеты в DataFrame

Я также заметил, что если я выполняю подсчет только одного столбца, то нулевые группы отображаются в DataFrame. Почему это? например:

# Group data by just Age Group column. Then perform count using the ID column.
groups = df.groupby(['Age Group'])
new_df = groups.agg({'ID': 'count'}).rename(columns={'ID':'Count'})
new_df # count displays the zero here for the 0-10 age group.

Любая помощь в объяснении того, что здесь происходит, будет оценена по достоинству.

Теги:
pandas
dataframe
pandas-groupby
count

1 ответ

0
Лучший ответ

Причина pd.cut вернет категориальные данные. Вот почему вы видите разницу между группами по два столбца с только категориальными столбцами

Вот один из способов исправить выход, используя reindex

new_df.reindex(pd.MultiIndex.from_product([np.unique(pd.cut(np.arange(50), bins, right=False)).tolist(),[0,1]]),fill_value=0)
Out[277]: 
            Count
[0, 10)  0      0
         1      0
[10, 20) 0      1
         1      1
[20, 30) 0      3
         1      0
[30, 40) 0      0
         1      1
[40, 50) 0      0
         1      1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню