首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas Dataframe中,两列上的Groupby和其中一列上的bin(范围)

在Pandas Dataframe中,两列上的Groupby和其中一列上的bin(范围)
EN

Stack Overflow用户
提问于 2019-11-06 21:07:32
回答 1查看 1.2K关注 0票数 1

我正在尝试根据特定的用户属性将我的数据隔离到存储桶中,我希望看到每个buckets.For中的一些计数,我已经将这些数据导入到熊猫数据帧中。

我有数据,有用户城市,孩子的年龄和他们唯一的id。我想知道居住在城市A并且孩子年龄在0-5岁的用户的数量。

示例数据框如下所示:

代码语言:javascript
复制
city  kids_age  user_id
A         10       1  
B          4       2
A          4       3        
C          8       4
A          3       5 

预期输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
user_details_df_cropped_1.groupby(['city', 'kids_age']).count()

它给了我一个类似如下的输出:

代码语言:javascript
复制
city  kids_age  user_id   count
 A      10       1          1
         4       3          1
         3       5          1
 B       4       2          1 
 C       8       4          1

我返回按城市分组的用户,但不是按孩子的年龄段(范围)分组。这里我漏掉了什么?感谢你的帮助!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-06 21:10:16

使用cut进行装箱,传递给DataFrame.groupby,使用DataFrame.stack DataFrame.unstack添加0行,最后通过Series.reset_index转换为DataFrame

代码语言:javascript
复制
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.reindexMultiIndex.from_product的另一种解决方案,用于添加由0填充的错误行

代码语言:javascript
复制
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      1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58730910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档