Pandas 分组日期范围和多列的不同计算

Int*_*ers 5 python pandas

我在按时间范围和按列的不同计算对熊猫 df 进行分组时遇到了麻烦:

让我们采用以下 df:

           date          identifier    value_1    value_2
0     05.07.2018 16:35       A           10          0
1     05.07.2018 16:36       B           20          1
2     05.07.2018 16:37       A           20          2
3     05.07.2018 16:39       B           30          1
4     05.07.2018 16:40       A           40          3
5     05.07.2018 16:41       B           20          2
6     05.07.2018 16:41       A           30          1
7     05.07.2018 16:42       B           50          2
8     05.07.2018 16:43       B           20          3
9     05.07.2018 16:44       A           20          1
Run Code Online (Sandbox Code Playgroud)

因此,我需要一个 df,它按 5 分钟间隔的时间和标识符分组,具有 value_1 的平均值和 value_2 的总和:

           date          identifier    value_1    value_2
0     05.07.2018 16:35       A           15          2
1     05.07.2018 16:35       B           25          2
2     05.07.2018 16:40       A           30          5
3     05.07.2018 16:40       B           30          7
Run Code Online (Sandbox Code Playgroud)

我怎样才能在大熊猫中以最有效的方式做到这一点?

来自维也纳的 THX & BR

sac*_*cuL 8

您可以在将列设置为正确格式后使用groupby, pd.Grouper, 和:aggdatedatetime

# Set date to datetime format. I'm assuming it's day.month.year in your original dataframe
df['date'] = pd.to_datetime(df.date, format = '%d.%m.%Y %H:%M')

new_df = (df.groupby(['identifier', pd.Grouper(key='date', freq='5min')])
          .agg({'value_1':'mean', 'value_2':'sum'}))

>>> new_df
                                value_1  value_2
identifier date                                 
A          2018-07-05 16:35:00       15        2
           2018-07-05 16:40:00       30        5
B          2018-07-05 16:35:00       25        2
           2018-07-05 16:40:00       30        7
Run Code Online (Sandbox Code Playgroud)

如果您想要与帖子中所需的输出格式相同,您可以使用它来排序:

new_df.reset_index().sort_values(['date','identifier'])

  identifier                date  value_1  value_2
0          A 2018-07-05 16:35:00       15        2
2          B 2018-07-05 16:35:00       25        2
1          A 2018-07-05 16:40:00       30        5
3          B 2018-07-05 16:40:00       30        7
Run Code Online (Sandbox Code Playgroud)