2017-10-13 4 views
1

채우기 나는 데이터는 multiIndexed 팬더 시리즈

import pandas as pd 
import numpy as np 

varNames = ["point1","point2","point3","point4","point5"] 
df = pd.DataFrame(np.random.randn(5,2),index=varNames,columns=["data1","data2"]) 

가득 팬더 dataframe을 가지고 있고 나는 multiIndex이에서 작성된로 시리즈를 만들고 싶습니다. 내가 할 수있는 색인 :

iterables=[["point1","point2","point3"],["point4","point5"]] 
index=pd.MultiIndex.from_product(iterables, names=['numerator', 'denominator']) 

나는 시리즈를 채우는 방법을 모르지만. 나는 내가 분자로 열거 된 첫 번째 dataframe의 각 행을, 그리고 분모를 열거 된 첫 번째 dataframe의 각 행하여 분할의에서 최대 값을 찾으려면 뭔가

s = pd.Series(max(df.loc[index["numerator"]]/df.loc[index["denominator"]]),index=index) 

같은 후 해요 일련의 결과 라인을 관련 시리즈 (변수 [variableN, variableM])에 저장합니다.

이것은 멀티 인덱스를 사용하여 처음으로 시리즈별로 한 줄씩 진행하면서 값을 저장하고 저장하는 것만 큼 짧은 것입니다. (나는 생각합니다. 아직 이것을 완전히 이해하기 위해) this, 나는 이것을하는 방법을 이해할 수 없다.

답변

0

당신은 max와 매개 변수 levelreindex를 사용할 수 있습니다

df3 = df.reindex(index, level=0).div(df.reindex(index, level=1)).max(level=0) 

샘플 :

np.random.seed(456) 
varNames = ["point1","point2","point3","point4","point5"] 
df = pd.DataFrame(np.random.randn(5,2),index=varNames,columns=["data1","data2"]) 
print (df) 
      data1  data2 
point1 -0.668129 -0.498210 
point2 0.618576 0.568692 
point3 1.350509 1.629589 
point4 0.301966 0.449483 
point5 -0.345811 -0.315231 

iterables=[["point1","point2","point3"],["point4","point5"]] 
index=pd.MultiIndex.from_product(iterables, names=['numerator', 'denominator']) 

df1 = df.reindex(index, level=0) 
print (df1) 
          data1  data2 
numerator denominator      
point1 point4  -0.668129 -0.498210 
      point5  -0.668129 -0.498210 
point2 point4  0.618576 0.568692 
      point5  0.618576 0.568692 
point3 point4  1.350509 1.629589 
      point5  1.350509 1.629589 

df2 = df.reindex(index, level=1) 
print (df2) 
          data1  data2 
numerator denominator      
point1 point4  0.301966 0.449483 
      point5  -0.345811 -0.315231 
point2 point4  0.301966 0.449483 
      point5  -0.345811 -0.315231 
point3 point4  0.301966 0.449483 
      point5  -0.345811 -0.315231 

print (df1.div(df2)) 
          data1  data2 
numerator denominator      
point1 point4  -2.212594 -1.108405 
      point5  1.932062 1.580459 
point2 point4  2.048493 1.265214 
      point5  -1.788768 -1.804050 
point3 point4  4.472386 3.625472 
      point5  -3.905339 -5.169509 

df3 = df.reindex(index, level=0).div(df.reindex(index, level=1)).max(level=0) 
print (df3) 
       data1  data2 
numerator      
point1  1.932062 1.580459 
point2  2.048493 1.265214 
point3  4.472386 3.625472 


df3 = (df.reindex(index, level=0).div(df.reindex(index, level=1)) 
     .max(level=0) 
     .reindex(index, level=0)) 
print (df3) 
          data1  data2 
numerator denominator      
point1 point4  1.932062 1.580459 
      point5  1.932062 1.580459 
point2 point4  2.048493 1.265214 
      point5  2.048493 1.265214 
point3 point4  4.472386 3.625472 
      point5  4.472386 3.625472 
+0

그건 ... 거의 작동합니다. 그것은 분자에 의해서만 인덱싱 된 데이터 프레임을 반환합니다. 나는 분자/분모 콤보에 의해 multiIndexed 인 것이다. – Ben

+0

답을 편집하고 마지막 단락을 확인하십시오. – jezrael

+0

완벽하게 작동합니다. 감사합니다. 이제 내가해야 할 일은 무슨 일이 일어나고 있는지 알아내는 것뿐입니다. :) – Ben