Задание: для каждого тикера посчитать среднюю цену, затем добавить столбцы со средними ценами (структура заголовка: 'Тикер', 'Средний', 'Тип') в исходный 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