2017-02-11 1 views
1

두 개의 MultiIndex'ed 데이터 프레임을 병합하려고합니다. 내 코드는 아래와 같습니다. 문제는 출력에서 ​​볼 수 있듯이 모든 값 (OPEN_INT, PX_LAST)을 같은 날짜 인덱스에두기를 원하는 반면 "DATE"인덱스가 반복된다는 것입니다. 어떤 아이디어입니까? 나는 append와 concat 모두 시도했지만, 둘 다 비슷한 결과를 준다.Python Pandas - 다중 색인 데이터 프레임 연결 문제

 if df.empty: 
      df = bbg_historicaldata(t, f, startDate, endDate) 
      print(df)    
      datesArray = list(df.index) 
      tArray = [t for i in range(len(datesArray))] 
      arrays = [tArray, datesArray] 
      tuples = list(zip(*arrays)) 
      index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])      
      df = pd.DataFrame({f : df[f].values}, index=index) 
    else: 
     temp = bbg_historicaldata(t,f,startDate,endDate) 
      print(temp) 
      datesArray = list(temp.index) 
      tArray = [t for i in range(len(datesArray))] 
      arrays = [tArray, datesArray] 
      tuples = list(zip(*arrays)) 
      index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE']) 


      temp = pd.DataFrame({f : temp[f].values}, index=index) 

      #df = df.append(temp, ignore_index = True) 
      df = pd.concat([df, temp], axis = 1).sortlevel() 

본질적으로 NaN 없음!

     PX_LAST OPEN_INT PX_LAST OPEN_INT PX_LAST \ 
TICKER  DATE               
EDH8 COMDTY 2017-02-01 98.365 1008044.0  NaN  NaN  NaN 
      2017-02-02 98.370 1009994.0  NaN  NaN  NaN 
      2017-02-03 98.360 1019181.0  NaN  NaN  NaN 
      2017-02-06 98.405 1023863.0  NaN  NaN  NaN 
      2017-02-07 98.410 1024609.0  NaN  NaN  NaN 
      2017-02-08 98.435 1046258.0  NaN  NaN  NaN 
      2017-02-09 98.395 1050291.0  NaN  NaN  NaN 
EDM8 COMDTY 2017-02-01  NaN  NaN 98.245 726739.0  NaN 
      2017-02-02  NaN  NaN 98.250 715081.0  NaN 
      2017-02-03  NaN  NaN 98.235 723936.0  NaN 
      2017-02-06  NaN  NaN 98.285 729324.0  NaN 
      2017-02-07  NaN  NaN 98.295 728673.0  NaN 
      2017-02-08  NaN  NaN 98.325 728520.0  NaN 
      2017-02-09  NaN  NaN 98.280 741840.0  NaN 
EDU8 COMDTY 2017-02-01  NaN  NaN  NaN  NaN 98.130 
      2017-02-02  NaN  NaN  NaN  NaN 98.135 
      2017-02-03  NaN  NaN  NaN  NaN 98.120 
      2017-02-06  NaN  NaN  NaN  NaN 98.180 
      2017-02-07  NaN  NaN  NaN  NaN 98.190 
      2017-02-08  NaN  NaN  NaN  NaN 98.225 
      2017-02-09  NaN  NaN  NaN  NaN 98.175 

EDIT : Axis = 0 일 때 다음과 같이 표시됩니다. 나는 그것이 복제 된 날짜 (즉, 각 날짜 인덱스가 고유 값, 중복 된 일 NaN을가한다)

      OPEN_INT PX_LAST 
TICKER  DATE       
EDH8 COMDTY 2017-02-01  NaN 98.365 
      2017-02-01 1008044.0  NaN 
      2017-02-02  NaN 98.370 
      2017-02-02 1009994.0  NaN 
      2017-02-03  NaN 98.360 
      2017-02-03 1019181.0  NaN 
      2017-02-06  NaN 98.405 
      2017-02-06 1023863.0  NaN 
      2017-02-07  NaN 98.410 
      2017-02-07 1024609.0  NaN 
      2017-02-08  NaN 98.435 
      2017-02-08 1046258.0  NaN 
      2017-02-09  NaN 98.395 
      2017-02-09 1050291.0  NaN 
EDM8 COMDTY 2017-02-01  NaN 98.245 
      2017-02-01 726739.0  NaN 
      2017-02-02  NaN 98.250 
      2017-02-02 715081.0  NaN 
      2017-02-03  NaN 98.235 
      2017-02-03 723936.0  NaN 
      2017-02-06  NaN 98.285 
      2017-02-06 729324.0  NaN 
      2017-02-07  NaN 98.295 
      2017-02-07 728673.0  NaN 
      2017-02-08  NaN 98.325 
      2017-02-08 728520.0  NaN 
      2017-02-09  NaN 98.280 
      2017-02-09 741840.0  NaN 

가 여기에 인쇄 된 입력 데이터입니다 붕괴하고 싶습니다. 위의 내용에 print (df)와 print (temp)를 추가했습니다. DATE를 색인으로 사용하는 모든 데이터 프레임입니다. 시세 지수는 "필드에서 F에 대한"루프에서 변수 "F"에서 유래

  PX_LAST 
DATE    
2017-02-01 98.365 
2017-02-02 98.370 
2017-02-03 98.360 
2017-02-06 98.405 
2017-02-07 98.410 
2017-02-08 98.435 
2017-02-09 98.395 
      OPEN_INT 
DATE     
2017-02-01 1008044.0 
2017-02-02 1009994.0 
2017-02-03 1019181.0 
2017-02-06 1023863.0 
2017-02-07 1024609.0 
2017-02-08 1046258.0 
2017-02-09 1050291.0 
      PX_LAST 
DATE    
2017-02-01 98.245 
2017-02-02 98.250 
2017-02-03 98.235 
2017-02-06 98.285 
2017-02-07 98.295 
2017-02-08 98.325 
2017-02-09 98.280 
      OPEN_INT 
DATE     
2017-02-01 726739.0 
2017-02-02 715081.0 
2017-02-03 723936.0 
2017-02-06 729324.0 
2017-02-07 728673.0 
2017-02-08 728520.0 
2017-02-09 741840.0 
      PX_LAST 
DATE    
2017-02-01 98.130 
2017-02-02 98.135 
2017-02-03 98.120 
2017-02-06 98.180 
2017-02-07 98.190 
2017-02-08 98.225 
2017-02-09 98.175 
      OPEN_INT 
DATE     
2017-02-01 584448.0 
2017-02-02 574246.0 
2017-02-03 581897.0 
2017-02-06 585169.0 
2017-02-07 590248.0 
2017-02-08 598478.0 
2017-02-09 595884.0 
+1

'TICKER' 지수 값이 다릅니다. 해당 색인 수준을 무시하거나 삭제 하시겠습니까? 원하는 결과는 무엇입니까? – unutbu

+0

기본적으로 멀티 인덱싱 된 데이터 프레임을 원합니다. 첫 번째 색인은 TICKER입니다. 다음 색인은 날짜입니다.그 다음에 열 PX_LAST 및 OPEN_INT가옵니다. – keynesiancross

+0

각 시세 표시기에는 시계열 데이터가 있지만 모든 시세 표시기는 동일한 열을 공유합니다. – keynesiancross

답변

2

당신의 논리는 당신이에서 다른 열을 얻고있는 이유를 가끔 볼 어렵다 (따라 조금 어렵다하여 데이터 통화). AFAICT는 TICKER와 DATE가 열인 경우 동일한 시세 표시기 (TICKER, DATE로 색인을 설정 한 경우) 또는 merge이있는 모든 프레임 중에서 join을 실제로 수행하고 그 결과를 연결하기 만하면됩니다. 문제를 일으키는 한 단계에서 두 가지를 모두 시도합니다.

다른 방법으로는 전체를 연결 한 다음 피벗 할 수 있습니다. 표시하기가 쉽기 때문에 여기에서 수행 할 것입니다.

(루프 내에서 반복적으로 연결하는 것은 성능 문제가 될 수 있습니다. 대용량 데이터는 매번 복사해야하므로 일반적으로 피해야합니다. 먼저 연결하려는 컬렉션을 빌드하고 그 적용)


을하여 각각의 프레임은 다음 (열이 다를 수 있습니다 곳)처럼 보이는 시작한다고 가정 :. 대신 당신이 지금은 '무슨 일을하는지의 다음

In [532]: df 
Out[532]: 
      PX_LAST 
DATE    
2017-02-01 98.365 
2017-02-02 98.370 
2017-02-03 98.360 
2017-02-06 98.405 
2017-02-07 98.410 
2017-02-08 98.435 
2017-02-09 98.395 

d 프레임에 티커를 추가하고 색인을 재설정하십시오. :

In [549]: df = df.assign(TICKER=t).reset_index() #TICKER variable = t 
Out[549]: 
     DATE PX_LAST  TICKER 
0 2017-02-01 98.365 EDH8 COMDTY 
1 2017-02-02 98.370 EDH8 COMDTY 
2 2017-02-03 98.360 EDH8 COMDTY 
3 2017-02-06 98.405 EDH8 COMDTY 
4 2017-02-07 98.410 EDH8 COMDTY 
5 2017-02-08 98.435 EDH8 COMDTY 
6 2017-02-09 98.395 EDH8 COMDTY 

은의이 용융하자, 병합 더 많은 메모리 친화적 만들려면 :

In [579]: pd.melt(df, id_vars=["TICKER", "DATE"]) 
Out[579]: 
     TICKER  DATE variable value 
0 EDH8 COMDTY 2017-02-01 PX_LAST 98.365 
1 EDH8 COMDTY 2017-02-02 PX_LAST 98.370 
2 EDH8 COMDTY 2017-02-03 PX_LAST 98.360 
3 EDH8 COMDTY 2017-02-06 PX_LAST 98.405 
4 EDH8 COMDTY 2017-02-07 PX_LAST 98.410 
5 EDH8 COMDTY 2017-02-08 PX_LAST 98.435 
6 EDH8 COMDTY 2017-02-09 PX_LAST 98.395 

및 목록 dfs이를 추가합니다. 이제 모두 동일한 열을 가지고 있기 때문에 부분적인 프레임은, 잘 결합 할 것이며, 우리는 우리의 원하는 출력을 얻기 위해 피벗 할 수 있습니다

In [589]: pd.concat(dfs).pivot_table(index=["TICKER", "DATE"], columns="variable", values="value") 
Out[589]: 
variable     OPEN_INT PX_LAST 
TICKER  DATE       
EDH8 COMDTY 2017-02-01 1008044.0 98.365 
      2017-02-02 1009994.0 98.370 
      2017-02-03 1019181.0 98.360 
      2017-02-06 1023863.0 98.405 
[...] 

이 모든 중간 NaN을을 가진 방지 할 수 있습니다. 연결 + 피벗 방식은 여러분이 녹지 않아도 작동 할 것이기 때문에 처음에는 용해를하지 않았지만 중급 NaN을 갖는 두 번째 생각은 중간 메모리 요구 사항이 금지되어있다.

+0

당신은 전설입니다, 감사합니다 DSM! 호기심에서 왜 많은 수의 기둥을 가지고이 문제에 접근하는 방식이 바뀌 었습니까? – keynesiancross

+0

@keynesiancross : 더 많은 열 (또는 해당 행에 대한 행)을 가질수록 중급 사전 피벗 데이터 프레임은 NaN에 불과합니다. 즉, 최종 버전이 몇 배 더 작아도 메모리에 막대한 * 중간 프레임이있을 수 있습니다. 사실, 나는 실제로 내 추천서의 순서를 바꿀 것이므로 그 길을 따라 다른 사람을 이끌어 가지는 않을 것입니다. – DSM

+0

DSM의 도움에 감사드립니다. – keynesiancross

관련 문제