使用Pandas groupby计算多个坡度

使用Pandas groupby计算多个坡度,pandas,Pandas,数据帧(多索引)格式的一些说明性数据: |实体|年|值| +------+------+-----+ |a | 1999 | 2| | | 2004 | 5 | |b | 2003 | 3| | | 2007 | 2 | || 2014 | 7 | 我想使用上例中每个实体a和b的scipy.stats.linregresse计算斜率。我尝试在后面的第一列中使用groupby,但似乎有问题,因为它需要一个Series值(a和b),而我需要对右侧的两列进行操作 这在R中

数据帧(多索引)格式的一些说明性数据:


|实体|年|值|
+------+------+-----+
|a | 1999 | 2|
|      | 2004 |  5  |
|b | 2003 | 3|
|      | 2007 |  2  |
|| 2014 | 7 |

我想使用上例中每个实体
a
b
scipy.stats.linregresse
计算斜率。我尝试在后面的第一列中使用
groupby
,但似乎有问题,因为它需要一个
Series
值(
a
b
),而我需要对右侧的两列进行操作


这在R中很容易通过
plyr
实现,但不确定如何在pandas中实现它。

您可以通过group by object的迭代器功能来实现。通过删除当前索引,然后通过“实体”指定组似乎更容易做到这一点

列表理解是快速处理迭代器中所有组的简单方法。或者使用dict理解将标签放在同一位置(然后您可以轻松地将dict粘贴到pd.DataFrame中)


可以使用
apply
功能将函数应用于
groupby
。在这种情况下,传递的函数是
linregresse
。请参阅下文:

In [4]: x = pd.DataFrame({'entity':['a','a','b','b','b'],
                          'year':[1999,2004,2003,2007,2014],
                          'value':[2,5,3,2,7]})

In [5]: x
Out[5]: 
  entity  value  year
0      a      2  1999
1      a      5  2004
2      b      3  2003
3      b      2  2007
4      b      7  2014


In [6]: from scipy.stats import linregress

In [7]: x.groupby('entity').apply(lambda v: linregress(v.year, v.value)[0])
Out[7]: 
entity
a    0.600000
b    0.403226

请注意,linregress末尾的[0]表示我们只对第一个返回参数(斜率)感兴趣。如果您需要所有返回数据,只需删除[0]即可获得元组列表。此示例非常有效。如果年份是日期,您将如何修改它
x=pd.DataFrame({'entity':['a','a','b','b','b'],'date':['1999-01-15','2004-01-15','2003-01-15','2007-01-15','2014-01-15','value':[2,5,3,2,7])x['date x['date date]=pd.to_datetime(x.date日期)
In [4]: x = pd.DataFrame({'entity':['a','a','b','b','b'],
                          'year':[1999,2004,2003,2007,2014],
                          'value':[2,5,3,2,7]})

In [5]: x
Out[5]: 
  entity  value  year
0      a      2  1999
1      a      5  2004
2      b      3  2003
3      b      2  2007
4      b      7  2014


In [6]: from scipy.stats import linregress

In [7]: x.groupby('entity').apply(lambda v: linregress(v.year, v.value)[0])
Out[7]: 
entity
a    0.600000
b    0.403226