Разделение данных по размеру каждой группы - PullRequest
0 голосов
/ 10 ноября 2018

Как я могу динамически преобразовать следующий код в простую одну строку в Pandas? Как всегда у меня есть диапазон из трех чисел, и выясняю, существуют ли данные между ними или нет?

dataA = data.groupby('ID').apply(lambda x:  (len(x) > 3) & (len(x) < 6))
dataB = data.groupby('ID').apply(lambda x:  (len(x) > 6) & (len(x) < 9))
dataC = data.groupby('ID').apply(lambda x:  (len(x) > 9) & (len(x) < 12))

1 Ответ

0 голосов
/ 10 ноября 2018

Полагаю, ваша цель - разбить ваш фрейм данных на группы в зависимости от размера каждой группы.

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

L = [3, 6, 9, 12]

sizes = data.groupby('ID')['SOME_COL'].transform('size')  # SOME_COL can be any series

data = {}
for key, (len1, len2) in zip('ABC', zip(L, L[1:])):
    data[key] = data.loc[sizes.between(len1, len2, inclusive=False)]

В качестве альтернативы, вы можете сформулировать вышеизложенное как словарь:

data = {key: data.loc[sizes.between(len1, len2, inclusive=False)] \
        for key, (len1, len2) in zip('ABC', zip(L, L[1:]))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...