#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))