Как правильно добавить столбцы в исходный многоиндексный DataFrame после groupby()?Python

Программы на Python
Anonymous
Как правильно добавить столбцы в исходный многоиндексный DataFrame после groupby()?

Сообщение Anonymous »

Существует DataFrame с тиккерами опционов на нулевом уровне, ценами (открытия, закрытия, максимума и минимума) на первом уровне и типами опционов на втором уровне (структура заголовка: «Тикер», «открытие/закрытие»). /high/low', 'Тип').
Задание: для каждого тикера посчитать среднюю цену, затем добавить столбцы со средними ценами (структура заголовка: 'Тикер', 'Средний', 'Тип') в исходный DataFrame. Мой скрипт выполняется почти корректно, но повреждает имена столбцов исходного DataFrame.
Код:

Код: Выделить всё

import pandas as pd
import numpy as np

df_f_avg = pd.DataFrame({
('a1c9', 'open',  'call'):    [3,      0.50,   3.0],
('a1c9', 'close', 'call'):    [4,      0.35,   3.5],
('a1c9', 'high',  'call'):    [1,      0.20,   1.5],
('a1c9', 'low',   'call'):    [2,      0.09,   2.5],
('a1p9', 'open',  'put'):     [5,      0.05,   4.0],
('a1p9', 'close', 'put'):     [6,      0.10,   5.5],
('a1p9', 'high',  'put'):     [7,      0.20,   6.0],
('a1p9', 'low',   'put'):     [8,      0.31,   7.0]})
df_f_avg.columns.names = ['Ticker', 'Price', 'Type']
df_f_avg

columns_name = df_f_avg.loc[:, pd.IndexSlice[:, 'open']].columns

avg_group_ticker = pd.DataFrame(data=df_f_avg.loc[:, (slice(None), ['open', 'close', 'high', 'low'], slice(None))].T.groupby('Ticker').mean().T)
avg_group_ticker.columns = columns_name
avg_group_ticker.columns._levels[1].values[:] = 'avg'

df_f_avg = pd.concat([df_f_avg, avg_group_ticker], axis=1)
df_f_avg
Получается вот так: …

Код: Выделить всё

Ticker                          a1c9                            a1p9    a1c9    a1p9
Price                           avg                             avg     avg     avg
Type    call    call    call    call    put     put     put     put     call    put
0       3.0     4.00    1.0     2.00    5.00    6.0     7.0     8.00    2.500   6.500
1       0.5     0.35    0.2     0.09    0.05    0.1     0.2     0.31    0.285   0.165
2       3.0     3.50    1.5     2.50    4.00    5.5     6.0     7.00    2.625   5.625

Но это должно выглядеть так: …

Код: Выделить всё

Ticker                          a1c9                            a1p9    a1c9    a1p9
Price   open    close   high    low     open    close   high    low     avg     avg
Type    call    call    call    call    put     put     put     put     call    put
0       3.0     4.00    1.0     2.00    5.00    6.0     7.0     8.00    2.500   6.500
1       0.5     0.35    0.2     0.09    0.05    0.1     0.2     0.31    0.285   0.165
2       3.0     3.50    1.5     2.50    4.00    5.5     6.0     7.00    2.625   5.625
Вопросы:

[*]Как это можно исправить (P.S. это сокращенный пример, в реальности там будет десятки тикеров)?
[*]Возможно, вы знаете более простой и эффективный способ решения этой задачи (более простой код, более надежный и универсальный, более быстрый, менее ресурсоемкий)?


Подробнее здесь: https://stackoverflow.com/questions/790 ... er-groupby

Вернуться в «Python»