Pandas GroupBy 和 MultiIndex 上列级别的最大值

Posted

技术标签:

【中文标题】Pandas GroupBy 和 MultiIndex 上列级别的最大值【英文标题】:Pandas GroupBy and max on MultiIndex upper column level 【发布时间】:2019-10-18 15:32:58 【问题描述】:

我正在尝试为 Pandas 多列索引数据框中的每一行获取最多 2 列。

我已将多个股票数据加载到 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

提前致谢!

【问题讨论】:

【参考方案1】:

试试这个

使用 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

【讨论】:

【参考方案2】:

IMO 的最佳解决方案是在列中使用 groupbylevel 参数:

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

【讨论】:

感谢cs95!我知道我必须使用 groupby,只是不知道使用什么参数。无论如何,这就是我一直在寻找的,除了我有更多的列,比如“音量”,我只想获得“打开”和“关闭”的最大值。我应该更清楚,但我得到了答案,以防其他人需要它:df[['Open','Close']].groupby(level=1,axis=1).max( )

以上是关于Pandas GroupBy 和 MultiIndex 上列级别的最大值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 使用 groupby 和模式填充

pandas如何对value列数据进行分组groupby?

Pandas 的groupby操作

在 Pandas 中使用 Keras StandardScaler 和 Groupby 函数

(pandas) 根据 groupby 和 column 条件填充 NaN

Groupby 和 sum 几列 pandas