我在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 for zero values [Pandas Groupby How to Show Zero Counts in 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.
任何帮助解释这里发生的事情都会受到赞赏。
答案 0 :(得分:0)
原因pd.cut
将返回分类数据。这就是为什么你看到groupby两列只有分类列
以下是使用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