Pandas 熊猫合并两个数据帧以形成一个多索引

Pandas 熊猫合并两个数据帧以形成一个多索引,pandas,pandas-datareader,Pandas,Pandas Datareader,我正在和熊猫玩,看看我是否能比其他工具做得更好/更快。如果我有一只股票,很容易创建每日计算L df['mystuff'] = df['Close']+1 如果我下载的股票不止一个,它就会变得复杂: df = df.stack() df['mystuff'] = df['Close']+1 df = df.unstack() 如果我想用prevous的day“Close”,它对我来说太复杂了。我想我可以回去取一个单独的代码,用iloc[I-1]或类似的东西做任何操作(我还没有弄清楚),然后合

我正在和熊猫玩,看看我是否能比其他工具做得更好/更快。如果我有一只股票,很容易创建每日计算L

df['mystuff'] = df['Close']+1
如果我下载的股票不止一个,它就会变得复杂:

df = df.stack() 
df['mystuff'] = df['Close']+1
df = df.unstack()
如果我想用prevous的day“Close”,它对我来说太复杂了。我想我可以回去取一个单独的代码,用iloc[I-1]或类似的东西做任何操作(我还没有弄清楚),然后合并数据帧

我如何合并两个数据帧的单一报价器有一个多索引? 以便:

就像

f = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end)
编辑: 这是我能创建的最接近f的东西。它不完全一样,所以我不确定我能不能用它来代替f

f_f = pd.concat(['AAPL':f1,'GOOG':f2},axis=1)
也许我应该尝试在多索引上进行操作,而不是在更简单的数据帧上进行拆分

完整代码:

import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

start = datetime(2001, 9, 1)
end = datetime(2019, 8, 31)
a = web.DataReader('AAPL', 'yahoo', start, end)
g = web.DataReader('GOOG', 'yahoo', start, end)
# here are shift/diff calculations that I don't knokw how to do with a multiindex
a_g = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end)
merged = pd.concat({'AAPL':a,'GOOG':g},axis=1)

a_g.to_csv('ag.csv')
merged.to_csv('merged.csv')
import code; code.interact(local=locals())

旁注:我不知道如何比较这两个csv。这并不完全相同,但它返回的多索引可以在
a_g
案例中使用

将pandas\u datareader.data作为web导入
作为pd进口熊猫
从日期时间导入日期时间
开始=日期时间(2019年7月1日)
结束=日期时间(2019年8月31日)
out=[]
对于[“AAPL”,“GOOG”]中的勾号:
d=web.DataReader(勾选“yahoo”,开始,结束)
cols=[(列,勾选)表示d列中的列]
d、 columns=pd.MultiIndex\
.从元组(cols,
名称=[“属性”、“符号”])
out.append(d)
df=pd.concat(向外,轴=1)
更新

如果您想要计算并添加一个新列,如果您有多个索引列,您可以按照以下步骤操作

将pandas\u datareader.data作为web导入
作为pd进口熊猫
从日期时间导入日期时间
开始=日期时间(2019年7月1日)
结束=日期时间(2019年8月31日)
滴答声=['AAPL','GOOG']
df=web.DataReader(勾选'yahoo',开始,结束)
名称=列表(df.columns.names)
df1=df[“关闭”].shift()
cols=[(“新”,col)表示df1.列中的col]
df1.columns=pd.MultiIndex.from_元组(cols,
名称=名称)
df=df.join(df1)

concat如何,然后在('yahoo',start,end')上分组?好吧,你不会得到同样的结果。我可以使用concat({'AAPL':f…),但它不像multiindexpd.concat(['AAPL':f1,'GOOG':f2},axis=1)是我能完成的最接近的事情。这个想法是,如果两个数据框架中的列相同,那么您不关心concat中的多索引。多索引由group by post处理,看起来像您的行
f=web.DataReader(['AAPL','GOOG','yahoo',start,end)
应该可以,你得到了什么?谢谢!你解决了我的问题,但很明显,你的更新看起来更适合我的需要。我将尝试一些更复杂的移位和填充,但似乎是正确的。我发现一个诀窍是你没有先创建新列。我想创建一个新列,然后用我的计算填充它(如第一行=100,第二行=first xx,第三行=secondxx等等)复制一行并填充它是可行的,但不优雅,我支持f3=df3.shift().fillna(100)*df['Close']/df['Close'].shift().fillna(df['Close'])这似乎是我想要做的事情。第一个值=100,第二个值取决于第一个值和一个计算
import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

start = datetime(2001, 9, 1)
end = datetime(2019, 8, 31)
a = web.DataReader('AAPL', 'yahoo', start, end)
g = web.DataReader('GOOG', 'yahoo', start, end)
# here are shift/diff calculations that I don't knokw how to do with a multiindex
a_g = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end)
merged = pd.concat({'AAPL':a,'GOOG':g},axis=1)

a_g.to_csv('ag.csv')
merged.to_csv('merged.csv')
import code; code.interact(local=locals())