Python 多索引上列级别的GroupBy和max
我试图为熊猫多列索引数据帧中的每一行获取最多2列 我已将多个股票数据加载到Pandas中,我正在尝试获取每个股票和每天的收盘价和开盘价的最大值 我给出的例子是一个简单化的例子,说明了我真正想做的事情,所以如果有人能给我一个解决方案,它不需要遍历每一列或每一行,并且运行时间很快,我将不胜感激Python 多索引上列级别的GroupBy和max,python,pandas,dataframe,group-by,multi-index,Python,Pandas,Dataframe,Group By,Multi Index,我试图为熊猫多列索引数据帧中的每一行获取最多2列 我已将多个股票数据加载到Pandas中,我正在尝试获取每个股票和每天的收盘价和开盘价的最大值 我给出的例子是一个简单化的例子,说明了我真正想做的事情,所以如果有人能给我一个解决方案,它不需要遍历每一列或每一行,并且运行时间很快,我将不胜感激 # import libaries import pandas as pd import datetime from dateutil.relativedelta import relativedelta f
# 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
提前谢谢 试试这个
使用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
试试这个
使用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
IMO的最佳解决方案是使用
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
IMO的最佳解决方案是使用
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
谢谢cs95!我知道我必须使用groupby,只是不知道该使用什么参数。无论如何,这是我一直在寻找的,除了我有更多的列,如“卷”,我只想得到最大的“开放”和“关闭”。我本应该更清楚一点,但我得到了答案,这是为了防止其他人需要它:df[['Open','Close']]].groupby(level=1,axis=1).max()谢谢cs95!我知道我必须使用groupby,只是不知道该使用什么参数。无论如何,这是我一直在寻找的,除了我有更多的列,如“卷”,我只想得到最大的“开放”和“关闭”。我应该更清楚一些,但我得到了答案,这是为了防止其他人需要它:df[['Open','Close']].groupby(level=1,axis=1).max()