web-dev-qa-db-ja.com

連結Pandas=新しいマルチインデックスレベルの下の列

次のようなデータフレームのディクショナリがあるとします。

_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
_

次のようなマルチインデックスを使用して、すべてのデータフレームを1つに結合する最も簡単な方法は何ですか?

_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_に沿って連結します。

42
Zero

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']))
63
Karl D.

データフレームにシンボル列を追加し、インデックスを設定してシンボル列を含め、そのレベルを連結してからアンスタックします。

以下は、dictにDataFramesと同じ数のシンボルがあること、および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構文に反対する人もいます。ここでは便宜上のみ使用しています。

2
Woody Pride