在 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
我正在尝试根据某些用户属性将我的数据隔离到存储桶中,我希望在每个 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