Pandas groupby团队规模最小

时间:2017-01-30 16:42:41

标签: python python-2.7 pandas grouping

我有一个形状为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

3 个答案:

答案 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)

然后你可以只使用有效的石斑鱼。 希望伪代码有所帮助,否则请提供可重现的示例。