我的数据如下:
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列的列的位置。
谢谢!
答案 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