Pandas Groupby,如何在级别或分析栏中保留其他列?

时间:2014-08-15 17:36:19

标签: python sql pandas

我的数据如下:

DATE    month   hour    val1    val2
1/1/2012    1   1   1   3
1/1/2012    1   2   2   4
1/1/2012    1   3   3   5
1/1/2012    1   4   4   6
1/1/2012    1   5   5   7
1/1/2012    1   6   6   8
1/1/2012    1   7   7   9
1/1/2012    1   8   8   10
1/1/2012    1   9   9   11
1/1/2012    1   10  10  12
1/1/2012    1   11  11  13
1/1/2012    1   12  12  14
1/1/2012    1   13  13  15
1/1/2012    1   14  14  16
1/1/2012    1   15  15  17
1/1/2012    1   16  16  18
1/1/2012    1   17  17  19
1/1/2012    1   18  18  20
1/1/2012    1   19  19  21
1/1/2012    1   20  20  22
1/1/2012    1   21  21  23
1/1/2012    1   22  22  24
1/1/2012    1   23  23  25
1/1/2012    1   24  24  26
1/2/2012    1   1   25  27
1/2/2012    1   2   26  28
1/2/2012    1   3   27  29
1/2/2012    1   4   28  30
1/2/2012    1   5   29  31
1/2/2012    1   6   30  32

假设数据的名称是df,我有一些SQL查询:

   select  distinct date, 
                    month, 
                    max(val1)  as val1,
                    mean(val2) as val2
       from df
       group by date
      ;

我想在熊猫中复制它 我试过了:

df.groupby('DATE')['val1'].max()   # it works
df.groupby('DATE')['val2'].mean()  # it works

我想将这两者结合起来:

df.groupby('DATE').agg(['val1'].max(), ['val2'].mean()) # it does't work

此外,我想保持"月"列(作为常规列,而不是索引),但我无法确定将其放在何处。有没有简单的方法(没有任何合并,加入)? 请帮忙。感谢。

附加:我的数据实际上有包含字符串的列。一天中的每个小时的状态都是相同的。

DATE    month   hour    val1    val2    status
1/1/2012    1   1   1   3   okay
1/1/2012    1   2   2   4   okay
1/1/2012    1   3   3   5   okay
1/1/2012    1   4   4   6   okay
1/1/2012    1   5   5   7   okay
1/1/2012    1   6   6   8   okay
1/1/2012    1   7   7   9   okay
1/1/2012    1   8   8   10  okay
1/1/2012    1   9   9   11  okay
1/1/2012    1   10  10  12  okay
1/1/2012    1   11  11  13  okay
1/1/2012    1   12  12  14  okay
1/1/2012    1   13  13  15  okay
...
1/2/2012    1   1   25  27  error
1/2/2012    1   2   26  28  error
1/2/2012    1   3   27  29  error
1/2/2012    1   4   28  30  error
1/2/2012    1   5   29  31  error
1/2/2012    1   6   30  32  error

我想通过DATE获取val1和val2组的摘要统计信息。同时,保持"状态"柱。我可以使用sql轻松完成。在pandas groupby语句中,我发现没有添加不属于groupby或analysis列的列的位置。

谢谢!

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题,agg采用了{column name - >的字典。函数}

In [35]: df.groupby('DATE').agg({'val1': 'max', 'val2': 'mean'})
Out[35]: 
          val1  val2
DATE                
1/1/2012    24  14.5
1/2/2012    30  29.5

你的第二个作为聚合并不真正有意义。你可以用

之类的东西破解它
In [36]: df.groupby('DATE').agg({'val1': 'max', 'val2': 'mean', 'month': 'max'})
Out[36]: 
          month  val1  val2
DATE                       
1/1/2012      1    24  14.5
1/2/2012      1    30  29.5

因为知道每个DATE的月份相同,但是如果数据中有错误怎么办?更好的做法是使DATE成为Datetimes数组,以便它成为DatetimeIndex:

In [43]: df['DATE'] = pd.to_datetime(df.DATE)
In [46]: result = df.groupby('DATE').agg({'val1': 'max', 'val2': 'mean'})

In [47]: result['month'] = result.index.month

In [48]: result
Out[48]: 
            val1  val2  month
DATE                         
2012-01-01    24  14.5      1
2012-01-02    30  29.5      1