我正在处理一个数据框,其中包含多年时间跨度记录的每日值,如
Date Position Value
2010-01-01 PEAK 60
2010-01-01 BOTTOM 51
2010-01-02 PEAK 62
2010-01-02 BOTTOM 50
...
2011-01-01 PEAK 70
2011-01-01 BOTTOM 61
2011-01-02 PEAK 72
2011-01-02 BOTTOM 60
...
2015-12-31 PEAK 92
2015-12-31 BOTTOM 83
也就是说,对应于每个日历日期的行条目连续6年重复,忽略闰年(即2月29日),并且我想按日历日期对它们进行分组,而不考虑以下格式的年份
Date Position Value
2010-01-01 PEAK 60
2010-01-01 BOTTOM 51
2011-01-01 PEAK 63
2011-01-01 BOTTOM 57
...
2015-01-01 PEAK 84
2015-01-01 BOTTOM 71
...
2014-12-31 PEAK 85
2014-12-31 BOTTOM 79
2015-12-31 PEAK 92
2015-12-31 BOTTOM 83
什么是更好的方法来进行这样的groupby()操作,假设我想保持余地,对每个日历中的值进行一些简单的计算(例如,max(),min(),mean())日期“小组”?
我确实检查过所有相关的帖子,但似乎无法找到适合我的目的。如果有人能指出更好的方法,我将非常感激。
谢谢。
答案 0 :(得分:1)
您需要解决排序问题。一种方法是使用中间数据框:
df2 = pd.DataFrame([df.Date.dt.month, df.Date.dt.day]).T
df2.columns = [0,1]
df2
Out[32]:
0 1
0 1 1
1 1 1
2 1 2
3 1 2
4 1 1
5 1 1
6 1 2
7 1 2
8 12 31
9 12 31
df2 = df2.sort_values([0,1])
现在使用我们现在在df
中的结果索引df2
重新索引df.reindex(df2.index)
Out[36]:
Date Position Value
0 2010-01-01 PEAK 60
1 2010-01-01 BOTTOM 51
4 2011-01-01 PEAK 70
5 2011-01-01 BOTTOM 61
2 2010-01-02 PEAK 62
3 2010-01-02 BOTTOM 50
6 2011-01-02 PEAK 72
7 2011-01-02 BOTTOM 60
8 2015-12-31 PEAK 92
9 2015-12-31 BOTTOM 83
:
@echo off
if "%~1" == "" goto :EOF
for %%I in ("%~1\*.tex") do C:\python27\python.exe "%~dp0tools\textool.py" -x -v -ra "%%~fI"
答案 1 :(得分:0)
IIUC你可以这样做:
In [2]: df
Out[2]:
Date Position Value
0 2010-01-01 PEAK 60
1 2010-01-01 BOTTOM 51
2 2010-01-02 PEAK 62
3 2010-01-02 BOTTOM 50
4 2011-01-01 PEAK 70
5 2011-01-01 BOTTOM 61
6 2011-01-02 PEAK 72
7 2011-01-02 BOTTOM 60
8 2015-12-31 PEAK 92
9 2015-12-31 BOTTOM 83
In [3]: df.groupby([df.Date.dt.month, df.Date.dt.day, 'Position']).agg(['min','mean','max','sum'])
Out[3]:
Value
min mean max sum
Date Date Position
1 1 BOTTOM 51 56 61 112
PEAK 60 65 70 130
2 BOTTOM 50 55 60 110
PEAK 62 67 72 134
12 31 BOTTOM 83 83 83 83
PEAK 92 92 92 92