2017-01-30 2 views
3

У меня есть информационная рамка df формы (450 000, 15), содержащая информацию о пользователях, а каждая строка - это другой пользователь с 13 характеристиками (возраст, пол, родной город ...) и 1 логическая переменная, независимо от того, имеет ли пользователь автомобиль или нет.Pandas groupby с минимальным размером группы

Я хотел бы перегруппировать своих пользователей, чтобы узнать, какие группы имеют большинство автомобилей, но мне нужно сохранить как минимум 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 

Я не нашел способ группировать данные по кадрам на основе критериев размера, поэтому мне было интересно, что будет с питоническим способом справиться с этим.

Поскольку у меня есть 13 характеристик для группировки пользователей, мне также интересно узнать о порядке группировки: следует ли сначала группировать по полу, а затем по возрасту или наоборот? Это оказывает влияние при использовании нескольких переменных с условием остановки.

Мне не нужно использовать панды, но я думал, что это будет уместно. Вывод должен выглядеть следующим образом:

name_of_group group_size 
Female   150000 
Male, <20  5040 
Male, 20-90 291930 
Male, 90+  3030 

ответ

3

groupby должен группа на «ключ», который должен быть отдельно вычислимым для каждой строки. То есть, нет никакого способа группировать по определенному критерию, который зависит от совокупных характеристик, которые вы не узнаете, пока не будет создана группа (например, ее размер). Вы можете написать код, который пробует разные группировки, и использует некоторую эвристику, чтобы решить, что является «лучшим», но для этого ничего не создано.

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) 

И тогда вы можете работать, используя только действительные окуни. Надеемся, что псевдокод помогает, в противном случае укажите пример воспроизводимости.

Смежные вопросы