Pandas GroupBy и max на верхнем уровне столбца MultiIndex - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь получить максимум 2 столбца для каждой строки в многостолбцовом индексе Pandas.

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

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

# import libaries
import pandas as pd
import datetime
from dateutil.relativedelta import relativedelta
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf

#declare dates
end_date = datetime.date.today()
start_date = end_date - relativedelta(days=3)

#load stock data (this code sometimes brings an error, just rerun it and it should work within a few tries)
yf.pdr_override()
df = pdr.get_data_yahoo(['AAPL','FB'], start_date, end_date)
print(df)

Выход:

              Open               Close  
              AAPL     FB        AAPL     FB
Date
2019-05-29    176.42   183.50    177.38   182.19
2019-05-30    177.95   183.08    178.30   183.01
2019-05-31    176.23   180.28    175.07   177.47

Желаемый вывод:

              Open               Close              Max     
              AAPL     FB        AAPL     FB        AAPL     FB
Date
2019-05-29    176.42   183.50    177.38   182.19    177.38   183.50
2019-05-30    177.95   183.08    178.30   183.01    178.30   183.08
2019-05-31    176.23   180.28    175.07   177.47    176.23   180.28

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Лучшее решение ИМО использует groupby с аргументом level вдоль столбцов:

u = df.groupby(level=1, axis=1).max()

Или, более конкретно,

u = df[['Open','Close']].groupby(level=1, axis=1).max()
u
              AAPL      FB
Date                      
2019-05-29  177.38  183.50
2019-05-30  178.30  183.08
2019-05-31  176.23  180.28

Теперь исправьте столбцы иобъединить результат.

u.columns = pd.MultiIndex.from_product([['Max'], u.columns])
pd.concat([df, u], axis=1)

              Open           Close             Max        
              AAPL      FB    AAPL      FB    AAPL      FB
Date                                                      
2019-05-29  176.42  183.50  177.38  182.19  177.38  183.50
2019-05-30  177.95  183.08  178.30  183.01  178.30  183.08
2019-05-31  176.23  180.28  175.07  177.47  176.23  180.28
0 голосов
/ 03 июня 2019

Просто попробуйте использовать это

Сравните два или более столбцов в кадре данных, используя ключевое слово max.

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [-2, 8, 1], "C": [1, 2, 3], "D": [-2, 8, 1]})
df["E"] = df[["A", "B"]].max(axis=1)
df["F"] = df[["C", "D"]].max(axis=1)
print(df)

Output:

    A   B   C   D   E   F
0   1   -2  1   -2  1   1
1   2   8   2   8   8   8
2   3   1   3   1   3   3

...