【问题标题】:Concatenate Pandas columns under new multi-index level在新的多索引级别下连接 Pandas 列
【发布时间】:2014-06-29 07:36:16
【问题描述】:

给定一个数据框字典,例如:

dict = {'ABC': df1, 'XYZ' : df2}   # of any length...

其中每个数据框具有相同的列和相似的索引,例如:

data           Open     High      Low    Close   Volume
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149

将所有数据帧合并为一个的最简单方法是什么,例如:

symbol         ABC                                       XYZ
data           Open     High      Low    Close   Volume  Open ...
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  ...
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  ...
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  ...

我尝试了一些方法 - 例如,对于每个数据框,将列替换为像 .from_product(['ABC', columns]) 这样的多索引,然后沿 axis=1 连接,但没有成功。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    您可以使用concat 来做到这一点(keys 参数将创建分层列索引):

    d = {'ABC' : df1, 'XYZ' : df2}
    print pd.concat(d.values(), axis=1, keys=d.keys())
    
    
                    XYZ                                          ABC           \
                   Open     High      Low    Close   Volume     Open     High   
    Date                                                                        
    2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  0.18077  0.18800   
    2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  0.18439  0.21331   
    2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  0.19523  0.20970   
    
    
                    Low    Close   Volume  
    Date                                   
    2002-01-17  0.16993  0.18439  1720833  
    2002-01-18  0.18077  0.19523  2027866  
    2002-01-21  0.19162  0.20608   771149
    

    真的concat 想要列表,所以以下是等价的:

    print(pd.concat([df1, df2], axis=1, keys=['ABC', 'XYZ']))
    

    【讨论】:

    • 我认为您不需要 Python 3 中的列表构造函数。可能会随着新的 pandas 版本而改变。
    • @brad-solomon,您对当前版本的 pandas 的看法是正确的。我想我最初在大多数人使用 0.13.0 或 0.13.1 时回答了这个问题
    • 作为discussed in this recent question,应避免使用d.valuesd.keys 这种方式,因为不能保证订单将被维持。考虑keys, values = zip(*d.items())
    • 我认为顺序是任意但一致的?这不是真的吗?只要它在调用中保持一致,就可以用于这个用例。
    • @KarlD.,你是对的。 python2docs。这一点也在this question 中进行了一定程度的讨论。
    【解决方案2】:

    将符号列添加到您的数据帧并设置索引以包含符号列,连接然后取消堆叠该级别:

    以下假设您的 dict 中有与 DataFrame 一样多的符号,并且您还根据 dict 键的顺序检查符号的顺序是否符合您的要求:

    DF_dict = {'ABC': df1, 'XYZ' : df2} 
    dict_keys = DF_dict.keys()
    symbols = ['ABC', 'ZXY']
    
    for x in xrange(len(symbols)):
        DF_dict[dict_keys[x]]['symbol'] = symbols[x]
        DF_dict[dict_keys[x]].reset_index(inplace = True)
        DF_dict[dict_keys[x]].set_index(['symbol', 'Date'], inplace = True)
    
    DF = pd.concat(DF_dict[df] for df in dict_keys)
    DF = DF.unstack('symbol')
    

    我认为这将是我将采取的方法。有些人反对inplace 语法。我在这里使用它只是为了方便。

    【讨论】:

    • 由于没有数据而无法对此进行测试,但它来自我之前写的东西。让我知道它是否有效....
    • 这行得通 - 关键概念是添加一列,然后旋转/取消堆叠等。我一直在考虑添加行或列标题。
    • 是的,但 Karl D 的回答可能更适合您。请参阅下面的答案。更简洁了
    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2016-12-27
    • 2015-04-06
    • 2018-06-10
    • 2021-09-23
    • 2018-07-09
    相关资源
    最近更新 更多