2017-10-01 7 views
1

時系列データを時系列データとマージしたい。multiindex列のデータフレームをマージする方法

まずデータフレーム

a_columns = pd.MultiIndex.from_product([["A","B","C"],["1","2"]]) 
a_index = pd.date_range("20100101","20110101",freq="BM") 
a = pd.DataFrame(columns=a_columns,index=a_index)#A 

第二データフレーム

b_columns = ["3","4","5"] 
b_index = ["A","B","C"] 
b = pd.DataFrame(columns=b_columns,index=b_index) 

どのように私は、これら2つに参加していますか?私の望むデータフレームはAの形をしていますが、追加の列があります。

ありがとうございます!

答えて

2

私はあなたがstackによって再形成し、その後to_framedfを作成する必要があると思う - 連結の必要性Datetimeindexのために、その新しいインデックスはaのインデックスの最初の値からでした。

最終concat + sort_indexreindex

d[c.columns] = d[c.columns].ffill() 
print (d) 
      A     B     C     
      1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 
2010-01-29 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-02-26 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-03-31 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-04-30 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-05-31 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-06-30 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-07-30 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-08-31 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-09-30 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-10-29 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-11-30 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-12-31 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 

同様溶液:

c = b.stack().to_frame(a.index[0]).T.reindex(a.index, method='ffill') 
print (c) 
      A  B  C  
      3 4 5 3 4 5 3 4 5 
2010-01-29 1 1 1 1 1 1 1 1 1 
2010-02-26 1 1 1 1 1 1 1 1 1 
2010-03-31 1 1 1 1 1 1 1 1 1 
2010-04-30 1 1 1 1 1 1 1 1 1 
2010-05-31 1 1 1 1 1 1 1 1 1 
2010-06-30 1 1 1 1 1 1 1 1 1 
2010-07-30 1 1 1 1 1 1 1 1 1 
2010-08-31 1 1 1 1 1 1 1 1 1 
2010-09-30 1 1 1 1 1 1 1 1 1 
2010-10-29 1 1 1 1 1 1 1 1 1 
2010-11-30 1 1 1 1 1 1 1 1 1 
2010-12-31 1 1 1 1 1 1 1 1 1 

d = pd.concat([a,c], axis=1).sort_index(axis=1) 
print (d) 
      A    B    C    
      1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 
2010-01-29 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-02-26 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-03-31 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-04-30 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-05-31 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-06-30 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-07-30 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-08-31 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-09-30 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-10-29 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-11-30 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
2010-12-31 2 2 1 1 1 2 2 1 1 1 2 2 1 1 1 
最初の行のみによって追加列に NaN Sを置き換える必要

#added some data - 2 
a_columns = pd.MultiIndex.from_product([["A","B","C"],["1","2"]]) 
a_index = pd.date_range("20100101","20110101",freq="BM") 
a = pd.DataFrame(2,columns=a_columns,index=a_index)#A 

#added some data - 1 
b_columns = ["3","4","5"] 
b_index = ["A","B","C"] 
b = pd.DataFrame(1,columns=b_columns,index=b_index) 

c = b.stack().to_frame(a.index[0]).T 
print (c) 
      A  B  C  
      3 4 5 3 4 5 3 4 5 
2010-01-29 1 1 1 1 1 1 1 1 1 

d = pd.concat([a,c], axis=1).sort_index(axis=1) 
print (d) 
      A     B     C     
      1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 
2010-01-29 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 2 2 1.0 1.0 1.0 
2010-02-26 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-03-31 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-04-30 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-05-31 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-06-30 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-07-30 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-08-31 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-09-30 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-10-29 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-11-30 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 
2010-12-31 2 2 NaN NaN NaN 2 2 NaN NaN NaN 2 2 NaN NaN NaN 

最終場合

関連する問題