5

我有多个带有股票价格的数据框,我想将它们对齐到一个仅包含所有股票收盘价的数据框。

我希望所有数据框中的所有日期都出现在日期列(索引)和“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] )?

在此先感谢和亲切的问候!短剑

4

1 回答 1

4

如果列表中有数据框(我的意思是实际的数据框对象,而不是它们的名称),看起来像这样:

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 理解更紧凑地执行此操作,但在示例代码中,为了便于理解,我更喜欢更明确地拼写出来。作为参考,dict 理解看起来像这样:

{"df{0:d}.Close".format(idx+1): df["Close"] for idx, df in enumerate(dflist)}
于 2013-06-08T18:22:12.323 回答