我有一个形状为df
的数据框(450 000,15),其中包含有关用户的信息,每行都是不同的用户,有13个特征(年龄,性别,家乡...)和1个布尔变量,无论用户是否拥有汽车。
我想重新组合我的用户,以找出哪些群组拥有最多的汽车,但我需要在一个群组中至少保留2500个用户,以保持其统计相关性。
test= df.groupby(['Gender'])
test.size() # check the groups size
Gender Female 150000 Male 300000 dtype: int64
到目前为止,我已经超过2500个用户群。所以我有另一个分组标准:
test2= df.groupby(['Gender','Age'])
test2.size()
Gender Age Female <30 15022 30-90 134960 90+ 18 Male <20 5040 20-90 291930 90+ 3030 dtype: int64
正如我们所料,我现在拥有的用户很少......
我想有这样的事情:
Gender Female 150 000 # Don't split here because groups will be too small # Here I can split, because group size > 2500 : Gender Age Male <20 5040 20-90 291930 90+ 3030 dtype: int64
我没有找到根据大小标准对数组进行分组的方法,所以我想知道处理这个问题的pythonic方法是什么。
由于我有13个特征来分组我的用户,我也想知道分组顺序:我应该先按性别分组,然后按年龄分组,还是相反?当使用具有停止条件的多个变量时,这会产生影响。
我不需要使用熊猫,但我认为这是合适的。输出应如下所示:
name_of_group group_size
Female 150000
Male, <20 5040
Male, 20-90 291930
Male, 90+ 3030
答案 0 :(得分:3)
groupby
必须分组&#34;键&#34;必须可以为每一行单独计算。也就是说,没有办法按照某些标准进行分组,这些标准取决于在创建组之后您不会知道的聚合特征(就像它的大小一样)。您可以编写尝试不同分组的代码,并使用一些启发式方法来确定哪个是最好的#34;但是没有内置任何内容。
答案 1 :(得分:1)
我认为FLab的答案可能更完整,更正确。但是,如果您正在快速解决问题;
column = 'Gender'
minimum_size = 2500
valid_groups = [g for g in set(df[col]) if sum(df[col] == g) >= minimum_size]
mask = df[column].isin(valid_groups)
df[mask].groupby(column)
答案 2 :(得分:0)
您希望所有群组至少拥有2500个用户吗?
你可以这样:
# List of all sets of categories you want to test
group_ids_list = [['Gender'], ['Age'], ['Gender','Age']]
# Will be filled with groups that pass your test
valid_groups = []
group_sizes = {}
for group_ids in group_ids_list :
grouped_df = df.groupby(group_id)
for key, group in grouped_df:
if len(group) > 25000:
valid_groups.append(group)
group_sizes[key] = len(group)
group_sizes = pd.Series(group_sizes)
然后你可以只使用有效的石斑鱼。 希望伪代码有所帮助,否则请提供可重现的示例。