pandas - 考虑最后一组与 groupby

标签 pandas group-by

我只是想多了解一点石斑鱼。我知道调用频率会使某些函数无效。但我想知道在使用grouper时是否有解决办法来计算最后一段。例如,我希望 max 计数包含下面 df13:30:00 和 13:45:00 之间的 15 分钟段.

df = pd.DataFrame({
    'Time' : ['1904-01-01 13:00:00','1904-01-01 13:10:00','1904-01-01 13:15:00','1904-01-01 13:25:00','1904-01-01 13:35:00'],                 
    'Number' : [2,2,1,1,1],                      
    })

df['Time'] = pd.to_datetime(df['Time'])

df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'left'))['Number'].max().ffill()
df = df.reset_index(level=['Time'])

输出:

                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       1
2 1904-01-01 13:30:00       1

这可以通过使用label = 'right'来实现。但输出是:

                 Time  Number
0 1904-01-01 13:15:00       2
1 1904-01-01 13:30:00       1
2 1904-01-01 13:45:00       1

我希望返回df:

                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       1
2 1904-01-01 13:30:00       1
3 1904-01-01 13:45:00       1

最佳答案

我在 pandas 0.24.2 中得到不同的输出:

df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'right'))['Number'].max().ffill()
df = df.reset_index(level=['Time'])
print (df)
                 Time  Number
0 1904-01-01 12:45:00       2
1 1904-01-01 13:00:00       2
2 1904-01-01 13:15:00       1
3 1904-01-01 13:30:00       1

标签可以按 label='right' 移动,但值没有改变:

df = (df.groupby(pd.Grouper(freq='15T', key='Time', label='right', closed = 'right'))['Number']
       .max().ffill())

#resample alternative
df2 = df.resample('15T', on='Time', label='right', closed='right')['Number'].max().ffill()
df2 = df.reset_index(level=['Time'])
print (df2)
                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       2
2 1904-01-01 13:30:00       1
3 1904-01-01 13:45:00       1

更多信息请参见 how to understand closed and label arguments in pandas resample method? ,因为 Grouper 使用相同的逻辑,并且大多数参数是相同的。

您的问题的可能解决方案是添加新行,并将最大日期时间移动15分钟:

df1 = pd.DataFrame({'Time': df['Time'].max() + pd.Timedelta('15T'),
                    'Number':df['Number'].iat[-1]}, index=[0])
print (df1)
                 Time  Number
0 1904-01-01 13:50:00       1

df = df.append(df1).groupby(pd.Grouper(freq='15T', key='Time'))['Number'].max()
df = df.reset_index(level=['Time'])

print (df)
                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       1
2 1904-01-01 13:30:00       1
3 1904-01-01 13:45:00       1

关于pandas - 考虑最后一组与 groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57335596/

相关文章:

python - 有没有办法打破带有类别的 pandas 列,以将类别名称作为列名称来分隔 true 或 false 列

postgresql - 在用 pandas 导出到 csv 的数据中发现文字换行符/回车符

python - 匹配直到第一次出现

SQL:从这样的数据中获取周期开始和结束日期时间?我正在努力解决的棘手的小难题

sql - 对多列使用 group by

Mysql:行分组时提供的值有多可靠?

sql - 来自数据库的 PHP 计数

python - 如何将 pandas 数据框列转换为 native python 数据类型?

pandas - 识别 pd.Series 中的连续 True 值组

sql - 如何按组删除SQL Server中除第一行和最后一行之外的所有行?