2017-10-13 96 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"]) 

的,我想用多指標從這個創建創建一個系列。我可以做的索引:

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

我不知道如何填寫這個系列。我以後像

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

我想參加,列出的一個分子中的第一數據幀的每一行,並在上市流通A分母中的第一數據幀的每一行劃分它,找到的最大值是產生一系列值並將其存儲在系列中的相關位置(s [variableN,variableM])。

這是我第一次使用這個多重索引的東西,並且缺乏一行一行地進行系列研究,找出價值並存儲它,類似(我認爲,我不認爲我已經能夠要完全理解這個)this,我不知道如何做到這一點。

回答

0

您可以用參數level使用reindexmax

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

這......幾乎可行。這將返回一個僅由分子索引的數據框。我在分子/分母組合之後進行多重索引。 – Ben

+0

我編輯答案,請檢查最後一段。 – jezrael

+0

完美的作品,謝謝。現在我需要做的是弄清楚發生了什麼:) – Ben