次のようなデータフレームのディクショナリがあるとします。
_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
_に沿って連結します。
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']))
データフレームにシンボル列を追加し、インデックスを設定してシンボル列を含め、そのレベルを連結してからアンスタックします。
以下は、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
構文に反対する人もいます。ここでは便宜上のみ使用しています。