我有多个数据框架与股票价格,我想要对齐到一个数据框架,其中只包含所有股票的收盘价.
我希望所有数据框中的所有日期都出现在日期列(索引)和“NA”中,以防该日期的股票没有收盘价.
两个数据帧(df1和df2)的示例:
In [5]: df1
Out[5]:
Open High Low Close
Date1
2012-01-05 22.00 22.66 23.11 24.04
2012-01-04 24.04 23.80 23.08 22.16
2012-01-03 22.16 21.27 20.42 21.24
2012-01-01 21.24 22.30 22.52 22.30
In [7]: df2
Out[7]:
Open High Low Close
Date1
2012-01-07 23.00 21.66 25.11 21.04
2012-01-06 22.00 22.66 23.11 24.04
2012-01-04 24.04 23.80 23.08 22.16
2012-01-02 22.16 21.27 20.42 21.24
2012-01-01 21.24 22.30 22.52 22.30
现在我能做到
In [8]: frame=pd.DataFrame({"df1.Close":df1["Close"],"df2.Close":df2["Close"]})
结果如预期:
In [9]: frame
Out[9]:
df1.Close df2.Close
Date1
2012-01-01 22.30 22.30
2012-01-02 NaN 21.24
2012-01-03 21.24 NaN
2012-01-04 22.16 22.16
2012-01-05 24.04 NaN
2012-01-06 NaN 24.04
2012-01-07 NaN 21.04
我如何更改代码以对动态数量的数据帧执行相同操作?
现在,我需要以这种方式对齐8个数据帧.有没有办法循环通过一个数据帧列表并像上面那样对齐它们 – 而不是手动绑定数据帧名称(如df [0]到df [7]比喻说)?
在此先感谢您的亲切问候!
短剑
最佳答案
如果列表中的数据框(实际的数据框对象,我的意思是,而不是它们的名称)看起来像这样:
dflist = [df1,df2,df3,df4,df5,df6,df7,df8]
那么下面的代码应该做你正在寻找的东西:
frame = {}
for idx,df in enumerate(dflist):
n = idx+1 # Since lists are 0-indexed
name = "df{0:d}.Close".format(n)
close = df["Close"]
frame[name] = close
你可以通过词典理解更紧凑地完成这个,但在示例代码中,我更喜欢为了便于理解而更明确地拼写出来.作为参考,dict理解看起来像这样:
{"df{0:d}.Close".format(idx+1): df["Close"] for idx,df in enumerate(dflist)}