2013-11-03 90 views
0

以下来自dataferame的提取(位于底部)具有带索引的区域和Quardate的多索引,我希望获取新的数据帧相同的索引和只有每个区域的最大日期的行..我无法弄清楚如何访问数据框索引值。 我想是这样的:使用索引名称通过Pandas中的多索引框架选择新数据帧

most_recent_date=totRegscore.region.Quradate.max() 

刚刚告诉我,“数据帧”对象有没有属性“区域” 我也想这样做:

last_quarter = most_recent_date - relativedelta(months=3) 

和做类似:

quarter_score_diff = [most_recent_date, last_quarter].diff() 

在这里,这一个答案,我不能获得工作的一个变种... Summary calculations on a Pandas Dataframe 样品输入:

               Score1  Score2 
region           Quradate   
North_Central-Birmingham-Tuscaloosa-Anniston 2010-01-15    47   50 
              2010-04-15    45   60 
              2010-07-15    45   40 

我觉得在这一点上我的主要问题是不能够使用索引名来选择穆蒂索引数据帧的特定行.... 所以在得到一个DF只有当前日期和一个用刚刚过去的季度日期两个dataframes的差异看起来像 输出示例:

                 Score1  Score2 
       region          Quradate   
quarterly_diff North_Central-Birmingham-Tuscaloosa-Anniston 2010-07-15  7   6 
quarterly_diff Huntsville         2010-07-15  6   5 
+1

可能只是我,但如果你添加样本输入和样本想要的输出,创建工作解决方案会容易得多 –

+0

编辑问题以澄清输入和输出(我希望) – dartdog

+0

什么可以帮助显示一些代码生成你开始使用的确切数据框,这看起来像你需要使用'''''',见[这里](http://pandas.pydata.org/pandas-docs/dev/indexing.html#cross -section-hierarchy-index) – Jeff

回答

3

这就是我的意思是呈现出生成函数。这会创建像你一样的样本数据,并呈现和回答;现在你很容易说,嘿,我想这(并创建一个示例输出)。

In [40]: df = DataFrame({ 'Score1' : [ 47,45,45,37,35,35], 
          'Score2' : [50,60,40,50,60,40] }, 
       index=MultiIndex.from_tuples([ (r,t) for t in date_range('2010-1-1',periods=3,freq='QS')+pd.offsets.Day(14) 
       for r in ['R1','R2'] ], names=['region','date'])).sortlevel() 

In [41]: df 
Out[41]: 
        Score1 Score2 
region date      
R1  2010-01-15  47  50 
     2010-04-15  45  40 
     2010-07-15  35  60 
R2  2010-01-15  45  60 
     2010-04-15  37  50 
     2010-07-15  35  40 

我觉得这是有益的,看看什么是真正传递到应用,在这种情况下是一个框架

In [5]: def f(x): 
    ...:  print x 
    ...:  return x 
    ...: 

In [6]: df.groupby(level='region').apply(f) 
        Score1 Score2 
region date      
R1  2010-01-15  47  50 
     2010-04-15  45  40 
     2010-07-15  35  60 
        Score1 Score2 
region date      
R2  2010-01-15  45  60 
     2010-04-15  37  50 
     2010-07-15  35  40 
Out[6]: 
        Score1 Score2 
region date      
R1  2010-01-15  47  50 
     2010-04-15  45  40 
     2010-07-15  35  60 
R2  2010-01-15  45  60 
     2010-04-15  37  50 
     2010-07-15  35  40 

对于每一个区域,让我从2个周期前列方向DIFF从2个qtrs前得分

In [16]: df.groupby(level='region').apply(lambda x: x.diff(2)) 
Out[16]: 
        Score1 Score2 
region date      
R1  2010-01-15  NaN  NaN 
     2010-04-15  NaN  NaN 
     2010-07-15  -12  10 
R2  2010-01-15  NaN  NaN 
     2010-04-15  NaN  NaN 
     2010-07-15  -10  -20 

DIFF中,只返回我的最后一个值

In [17]: df.groupby(level='region').apply(lambda x: x.diff(2).iloc[-1]) 
Out[17]: 
     Score1 Score2 
region     
R1   -12  10 
R2   -10  -20 
+0

我试图创建的是来自上一季度的R1差异以及来自上一季度的R2差异。例如在您的示例解决方案中,只是每个区域的最后一行。我不明白lambda知道如何回差异,我还需要返回3以获得差异,以便从一年前获得差异...所以这将是(lambda x:x [ - 3] .diff())??所以这给了我最后一行totRegscore.groupby(level ='region')。apply(lambda x:x.diff()[ - 1:]) – dartdog

+0

我添加了一些有用的逻辑,并展示了如何使用diff。 – Jeff

+0

正是我所需要的! – dartdog

相关问题