Как применить функцию к каждой группе и сохранить ту же форму фрейма данных - PullRequest
0 голосов
/ 27 мая 2020

У меня есть фрейм данных с категориями, я sh группирую его по переменной категории, а затем применяю некоторую функцию f (x), где x - это группа, и возвращает 2D-массив той же формы, что и группа.

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

Я использовал функцию применения, это применимо f для каждой группы довольно хорошо, но не получается с результирующим индексом фрейма данных, который теперь по категориям, мне нужен исходный индекс, который был в исходном фрейме данных, прежде чем применять f, как я могу этого добиться?

например, если мой ввод следующий df:

1  0.6 A
2  0.2 B
3  0.5 B
4  0.8 A

Здесь у меня есть две группы A и B, я wi sh, чтобы применить функцию f (x) для каждой группы и вернуть группу такой же формы, это даст мне следующий результат с использованием функции apply

A 0.6
A 0.8
B 0.2
B 0.5

Как я могу вернуться к старой структуре фрейма данных

Примечание: Я не могу использовать преобразование, потому что моя функция f должна принимать группу (2D-массив) в качестве ввода и выводить целую группу (подумайте о функции fit_transform из sklearn imputer)

1 Ответ

0 голосов
/ 27 мая 2020

Попробуйте установить аргументы as_index и group_keys на pandas.DataFrame.groupby на False - это может быть то, что вы ищете:

as_index : bool, по умолчанию True

Для агрегированного вывода вернуть объект с метками группы в качестве индекса. Актуально только для ввода DataFrame. as_index = False - это фактически сгруппированный вывод «SQL -style».

group_keys : bool, по умолчанию True

При вызове apply добавьте групповые ключи для индексации для идентификации частей.

Не зная точно, в чем заключается ваша функция, трудно быть уверенным, что она сработает, но для чего-то вроде назначения нового столбца это хорошо работает:

In [2]: df = pd.DataFrame([[0.6, 'A'], [0.2, 'B'], [0.5, 'B'], [0.8, 'A']])
In [3]: def assign_total_as_col(df):
   ...:     return df.assign(total=float(df[0].sum()))
   ...:
In [4]: df.groupby(1, as_index=False, group_keys=False).apply(assign_total_as_col)
Out[4]:
     0  1  total
0  0.6  A    1.4
3  0.8  A    1.4
1  0.2  B    0.7
2  0.5  B    0.7

Сортировка индекса результирующего кадра (с df.sort_index()) даст вам результат, который вы ищете, если индекс, с которого вы начали, был отсортирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...