Создание столбца фрейма данных, полученного в результате Groupby и transform

#pandas #group-by #transform

#панды #групповое-по #трансформировать

Вопрос:

У меня есть фрейм данных из 4 столбцов textId, A, B, C

Я хотел бы создать объект groupby, а затем вычислить 5-й процентиль в столбце C, а затем добавить этот столбец (называя его «квантиль») обратно в исходный фрейм данных.

У меня есть следующий код, который работает, когда groupby находится в одном столбце

 df2['quantile']=df2.C.groupby(df2.itextID).transform(lambda x: 
x.quantile(q=0.5))
 

Вопрос 1:
Как это можно расширить, чтобы объект groupby теперь использовал два столбца, т.е. textId amp; A?

Вопрос 2: Можно ли сначала создать объект groupby, а затем применить преобразование? т.е.

 ### Create groupby object Extract top 4 rows in each group
grp = df2.groupby('textID').head(4)
??? how to apply the transform to column C?
 

Спасибо

(Можно ли использовать обозначения в квадратных скобках вместо точек?)

Ответ №1:

Используйте альтернативу с именами столбцов в списке внутри groupby и укажите столбцы после groupby для обработки transform или другой функции:

 df2['quantile']= (df2.groupby(['itextID', 'A'])['C']
                     .transform(lambda x: x.quantile(q=0.5)))
 

Здесь grp DataFrame, а не groupby object, потому GroupBy.head что возвращает DataFrame :

 grp = df2.groupby('textID').head(4)
 

Но возможно создать groupby объект, удалив .head(4) :

 grp = df2.groupby('textID')
 

А затем используйте head :

 df = grp.head(4)
 

Или transform :

 df2['new'] = grp['C'].transform(lambda x: x.quantile(q=0.5))
 

Комментарии:

1. Спасибо, как бы вы объединили head и transform, просто связали их?

2. @user11305439 Это небольшая проблема, потому head что фильтрация означает, что после ее применения остается меньше строк. Функция transform работает по-другому, фильтрация отсутствует. Таким образом, объединение в цепочку — это проблема df1 = df2.groupby('textID').head(4). transform(function) . Поэтому сначала нужна фильтрация df3 = df2.groupby('textID').head(4) , а затем создание нового столбца с помощью df3['new'] = df3.groupby('textID')['C'].transform(lambda x: x.quantile(q=0.5))