【问题标题】:Selecting a new dataframe via a multi-indexed frame in Pandas using index names使用索引名称通过 Pandas 中的多索引帧选择新数据帧
【发布时间】:2013-11-03 18:00:48
【问题描述】:

以下来自dataferame(底部)的摘录有一个以区域和Quardate为索引的多索引,我想获得一个具有相同索引的新数据框,并且只有每个区域具有最大日期的行..我不知道如何访问数据框索引值。 我想要类似的东西:

most_recent_date=totRegscore.region.Quradate.max()

这只是告诉我'DataFrame'对象没有属性'region' 我也想做:

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 和一个只有上个季度日期的 dF 时,两个数据框的差异看起来像 示例输出:

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

【问题讨论】:

  • 可能只有我一个人,但如果您添加示例输入和示例所需的输出,创建工作解决方案会容易得多
  • 编辑问题以澄清输入和输出(我希望)
  • 显示一些生成您开始使用的确切数据帧的代码会有所帮助,这看起来您需要使用xs,请参阅here

标签: python pandas


【解决方案1】:

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

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 个时期前的列差异

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

与 2 qtrs 前的差异,只返回最后一个值

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

【讨论】:

  • 我要创建的是上一季度的 R1 差异,然后是上一季度的 R2 差异。例如,在您的示例解决方案中,只是每个区域的最后一行。我不明白 lambda 是如何知道返回一个差异的,我还需要一个返回 3 的差异来获取一年前的差异......那就是 (lambda x: x[- 3].diff()) ??所以这给了我最后一行 totRegscore.groupby(level='region').apply(lambda x: x.diff()[-1:])
  • FWIW 最后一行的索引可以是:totRegscore.groupby(level='region').apply(lambda x: x.diff(4)[-1:])跨度>
  • @Jeff:你会如何保留最后一行的日期?
  • @unutbu 至少当我以他的形式运行它以及当我只使用 [-1:] 时,日期就在那里,尽管我确实在虚假列中复制了区域标签..原始示例是通过先前的 groupby 区域和日期创建的..
  • @dartdog:要删除重复的索引,请尝试:df.groupby(level='region', group_keys=False).apply(lambda x: x.diff(4)[-1:])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
相关资源
最近更新 更多