Подтвердить что ты не робот

Разделить pandas данные на основе groupby

Я хочу разбить следующий фрейм данных на основе столбца ZZ

df = 
        N0_YLDF  ZZ        MAT
    0  6.286333   2  11.669069
    1  6.317000   6  11.669069
    2  6.324889   6  11.516454
    3  6.320667   5  11.516454
    4  6.325556   5  11.516454
    5  6.359000   6  11.516454
    6  6.359000   6  11.516454
    7  6.361111   7  11.516454
    8  6.360778   7  11.516454
    9  6.361111   6  11.516454

Как вывод, я хочу, чтобы новый фреймворк с столбцом "N0_YLDF" разбился на 4, один новый столбец для каждого уникального значения ZZ. Как мне это сделать? Я могу делать groupby, но не знаю, что делать с сгруппированным объектом.

4b9b3361

Ответ 1

gb = df.groupby('ZZ')    
[gb.get_group(x) for x in gb.groups]

Ответ 2

Есть другая альтернатива, так как groupby возвращает генератор, который мы можем просто использовать для понимания списка, чтобы получить 2-е значение (фрейм).

dfs = [x for _, x in df.groupby('ZZ')]

Ответ 3

В R существует метод dataframe, называемый split. Это для всех пользователей R:

def split(df, group):
     gb = df.groupby(group)
     return [gb.get_group(x) for x in gb.groups]

Ответ 4

Храните их в формате dict, который позволяет вам получить доступ к группе DataFrames на основе ключей группы.

d = dict(tuple(df.groupby('ZZ')))
d[6]

#    N0_YLDF  ZZ        MAT
#1  6.317000   6  11.669069
#2  6.324889   6  11.516454
#5  6.359000   6  11.516454
#6  6.359000   6  11.516454
#9  6.361111   6  11.516454

Если вам нужна только подмножество DataFrame, в данном случае только серия 'NO_YLDF', вы можете изменить понимание слова.

d = dict((idx, gp['N0_YLDF']) for idx, gp in df.groupby('ZZ'))
d[6]
#1    6.317000
#2    6.324889
#5    6.359000
#6    6.359000
#9    6.361111
#Name: N0_YLDF, dtype: float64