带有lambda参数的pandas groupby

时间:2016-08-20 10:58:53

标签: python pandas lambda

我无法理解代码:

pivot = pd.pivot_table(subset, values='count', rows=['date'], cols=['sample'], fill_value=0)

by = lambda x: lambda y: getattr(y, x)

grouped = pivot.groupby([by('year'),by('month')]).sum()
代码中的

subset是一个DataFrame,其中有一个名为“date”的列(例如2013-02-04 06:20:49.634244),并且没有名为“year”和“month”的列

  

我遇到麻烦

  • 我无法弄清楚:“年份”和“月份”:

    grouped = pivot.groupby([by('year'),by('month')]).sum()
    
  • 的含义是什么
    grouped = pivot.groupby([by('year'),by('month')]).sum()
    
  

我做了什么:

  • 在pandas pandas document中说:pandas.DataFrame.groupby的第一个参数可以是

      

    by:映射函数/函数列表,dict,Series或tuple /

  • by = lambda x:lambda y:getattr(y,x)

  

表示by('bar')返回一个从对象

返回属性'bar'的函数

1 个答案:

答案 0 :(得分:1)

如果将callable传递给groupby,则会在DataFrame索引上调用它,因此此代码按日期时间索引的年份和月份进行分组。

In [55]: df = pd.DataFrame({'a': 1.0}, 
                           index=pd.date_range('2014-01-01', periods=13, freq='M'))

In [56]: df.groupby([by('year'), by('month')]).sum()
Out[56]: 
           a
2014 1   1.0
     2   1.0
     3   1.0
     4   1.0
     5   1.0
     6   1.0
     7   1.0
     8   1.0
     9   1.0
     10  1.0
     11  1.0
     12  1.0
2015 1   1.0

更明确

In [57]: df.groupby([df.index.year, df.index.month]).sum()
Out[57]: 
           a
2014 1   1.0
     2   1.0
     3   1.0
     4   1.0
     5   1.0
     6   1.0
     7   1.0
     8   1.0
     9   1.0
     10  1.0
     11  1.0
     12  1.0
2015 1   1.0