我正在尝试根据特定的用户属性将我的数据隔离到存储桶中,我希望看到每个buckets.For中的一些计数,我已经将这些数据导入到熊猫数据帧中。
我有数据,有用户城市,孩子的年龄和他们唯一的id。我想知道居住在城市A并且孩子年龄在0-5岁的用户的数量。
示例数据框如下所示:
city kids_age user_id
A 10 1
B 4 2
A 4 3
C 8 4
A 3 5 预期输出:
city bin count
A 0-5 2
5-10 1
B 0-5 1
5-10 0
C 0-5 0
5-10 1我在两列城市和孩子年龄上尝试了group by:
user_details_df_cropped_1.groupby(['city', 'kids_age']).count()它给了我一个类似如下的输出:
city kids_age user_id count
A 10 1 1
4 3 1
3 5 1
B 4 2 1
C 8 4 1我返回按城市分组的用户,但不是按孩子的年龄段(范围)分组。这里我漏掉了什么?感谢你的帮助!!
发布于 2019-11-06 21:10:16
使用cut进行装箱,传递给DataFrame.groupby,使用DataFrame.stack DataFrame.unstack添加0行,最后通过Series.reset_index转换为DataFrame
bins = [0,5,10]
labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])]
b = pd.cut(df['kids_age'], bins=bins, labels=labels, include_lowest=True)
df = df.groupby(['city', b]).size().unstack(fill_value=0).stack().reset_index(name='count')
print (df)
city kids_age count
0 A 0-5 2
1 A 5-10 1
2 B 0-5 1
3 B 5-10 0
4 C 0-5 0
5 C 5-10 1使用DataFrame.reindex和MultiIndex.from_product的另一种解决方案,用于添加由0填充的错误行
bins = [0,5,10]
labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])]
b = pd.cut(df['kids_age'], bins=bins, labels=labels, include_lowest=True)
mux = pd.MultiIndex.from_product([df['city'].unique(), labels], names=['city','kids_age'])
df = (df.groupby(['city', b])
.size()
.reindex(mux, fill_value=0)
.reset_index(name='count'))
print (df)
city kids_age count
0 A 0-5 2
1 A 5-10 1
2 B 0-5 1
3 B 5-10 0
4 C 0-5 0
5 C 5-10 1https://stackoverflow.com/questions/58730910
复制相似问题