Объединить подгруппу в соседнюю подгруппу после группового - PullRequest
0 голосов
/ 09 мая 2018

Если мы запустим следующий код

np.random.seed(0) 
features = ['f1','f2','f3']

df = pd.DataFrame(np.random.rand(5000,4), columns=features+['target'])
for f in features:
    df[f] = np.digitize(df[f], bins=[0.13,0.66])
    df['target'] = np.digitize(df['target'], bins=[0.5]).astype(float)

df.groupby(features)['target'].agg(['mean','count']).head(9)

Мы получим средние значения для каждой группировки набора функций:

            mean    count
f1  f2  f3      
0   0   0   0.571429    7
        1   0.414634    41
        2   0.428571    28
    1   0   0.490909    55
        1   0.467337    199
        2   0.486726    113
    2   0   0.518519    27
        1   0.446281    121
        2   0.541667    72

В приведенной выше таблице некоторые группы имеют слишкомНесколько наблюдений, и я хочу объединить их в «смежную» группу по некоторым правилам.Например, я могу захотеть объединить группу [0,0,0] с группой [0,0,1], поскольку она имеет не более 30 наблюдений.Интересно, есть ли какой-нибудь хороший способ работы таких групповых комбинаций по значениям столбцов без создания отдельного словаря?Более конкретно, я могу захотеть объединиться из группы с наименьшим количеством в смежную группу (следующую группу в порядке индекса), пока общее количество групп не станет больше 10.

1 Ответ

0 голосов
/ 09 мая 2018

Простой способ сделать это с помощью цикла for для индексов, соответствующих вашему условию:

df_group = df.groupby(features)['target'].agg(['mean','count'])
# Fist reset_index to get an easier manipulation
df_group = df_group.reset_index()
list_indexes = df_group[df_group['count'] <=58].index.values # put any value you want
# loop for on list_indexes
for ind in list_indexes:
    # check again your condition in case at the previous iteration 
    # merging the row has increase the count above your cirteria
    if df_group['count'].loc[ind] <= 58:
        # add the count values to the next row
        df_group['count'].loc[ind+1] = df_group['count'].loc[ind+1] + df_group['count'].loc[ind]
        # do anything you want on mean
        # drop the row
        df_group = df_group.drop(axis = 0, index = ind)
# Reindex your df
df_group = df_group.set_index(features)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...