在 Pandas Dataframe 中的两列上分组,其中一列上有 bins(ranges)

Groupby on two columns with bins(ranges) on one of them in Pandas Dataframe

我正在尝试根据某些用户属性将我的数据隔离到存储桶中,我希望在每个 buckets.For 中看到一些计数,我已将此数据导入 Pandas数据框。

我有包含用户城市、孩子年龄和他们的唯一 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

我尝试在城市和孩子年龄两列上分组:

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

我 returns 我是按城市分组的用户,而不是真正按儿童年龄段(范围)分组的用户。我在这里错过了什么?感谢您的帮助!!

使用cut for binning, pass to DataFrame.groupby, add 0 rows with DataFrame.stack DataFrame.unstack an last convert to DataFrame by Series.reset_index:

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 and 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      1