【问题标题】:Merging multiple, unaligned data-frames into single pandas data-frame将多个未对齐的数据框合并为单个 pandas 数据框
【发布时间】:2013-06-04 19:52:36
【问题描述】:

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

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

提前致谢和亲切的问候! 德克

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    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)}
    

    【讨论】:

    • 非常酷,非常感谢!有了这个例子,我已经成功了一半。现在我将如何使“dflist”动态化?我不会预先知道我需要多少数据帧 - 所以我想我正在寻找一种方法来动态创建多个数据帧然后使用你的代码。非常感谢您的帮助!
    • 只需使用标准的列表操作方法,例如append()——例如,当您获得一个新的数据框时,请执行dflist.append(new_df) 之类的操作。
    • 我想我越来越近了。我现在将数据框加载到一个字典中,其中键是股票的代码,值是带有股票 OHLC 报价的数据框。现在我有一个包含 8 个键/值对的字典。剩下的问题是:如何通过遍历我的 dict 将数据帧合并为一个?
    • 如果你遍历一个字典,你会得到键:for key in my_dict: print key。但是dicts也有一个iteritems()方法来产生(key, value)的元组,所以你可以做for key, val in my_dict.iteritems()。请注意,在 Python 3 中,iteritems() 被重命名为 items(),因此请根据您使用的是 Python 2.x 还是 3.x 使用适当的名称。
    • Python 教程涵盖了您提出的其中一些问题——您完成了吗?如果没有,它可能对你有好处。转到docs.python.org/3/tutorial/index.htmldocs.python.org/2.7/tutorial/index.html,具体取决于您使用的是 Python 3.x 还是 2.x。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2021-10-08
    • 2015-10-17
    • 2021-08-23
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多