При вызове функции с помощью groupby
+ apply
, я хочу, чтобы перейти от DataFrame
к Series
объекту GroupBy, применить функцию к каждой группе, которая принимает Series
в качестве входных данных и возвращает Series
, а затем назначить вывод из groupby
+ apply
вызов в качестве поля в поле DataFrame
. По умолчанию используется вывод из groupby
+ apply
, проиндексированный полями группировки, что мешает мне переписать его обратно на DataFrame
. Я бы предпочел, чтобы функция, которую я вызываю, применяю, беру Series
как входной сигнал и возвращаю Series
в качестве вывода; Я думаю, что это немного чище, чем DataFrame
до DataFrame
. (Это не самый лучший способ добраться до результата для этого примера, реальное применение довольно разные.)Сохранил индекс DataFrame, когда с помощью GroupBy применяется для создания Series
import pandas as pd
df = pd.DataFrame({
'A': [999, 999, 111, 111],
'B': [1, 2, 3, 4],
'C': [1, 3, 1, 3]
})
def less_than_two(series):
# Intended for series of length 1 in this case
# But not intended for many-to-one generally
return series.iloc[0] < 2
output = df.groupby(['A', 'B'])['C'].apply(less_than_two)
Я хочу индекс output
быть такой же, как df
, в противном случае я не могу назначить к df
(чисто):
df['Less_Than_Two'] = output
Что-то вроде output.index = df.index
кажется слишком уродливым, и используя group_keys
аргумент, кажется, не работает:
output = df.groupby(['A', 'B'], group_keys = False)['C'].apply(less_than_two)
df['Less_Than_Two'] = output
Похоже, что 'transform' сохраняет те же' dtype', что и поле ввода. Мне понравилось, что 'transform' хранит оригинальный' Index', хотя я не обязательно смотрю на трансляцию здесь, что, я думаю, не имеет значения, потому что результаты имеют длину 1. Этот ответ является лучшим по духу, хотя в полная проблема 'transform' преобразует' boolean' в 'datetime', которая не может быть преобразована обратно в' boolean'. Исходя из R, я чувствую, что «Индекс» - это обоюдоострый меч, а «dtypes» - это сложный процесс, но мне нравится многое другое. –