2017-10-01 2 views
1

정적 데이터를 시간에 따라 변하는 데이터와 병합하고 싶습니다.다중 인덱스 열 데이터 프레임을 병합하는 방법

먼저 dataframe

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 

둘째 dataframe 나는이 두 가지를 결합하려면 어떻게

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

? 원하는 데이터 프레임은 A 형식이지만 추가 열이 있습니다.

감사합니다.

답변

2

난 당신이 to_frame에 의해 df를 생성 한 후 stack으로 바꿀와 필요가 있다고 생각 - CONCAT 위해 이렇게 새로운 지수는 a의 인덱스의 첫 번째 값 출신, Datetimeindex이 필요합니다.

마지막 concat + sort_index : reindex

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의 교체가 필요

#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 

마지막 경우

관련 문제