每6小时对数据帧进行分组并生成新列

时间:2017-01-29 00:07:24

标签: python pandas dataframe group-by

我有这个数据框(类型可以是1或2):

user_id | timestamp      | type
1       | 2015-5-5 12:30 | 1
1       | 2015-5-5 14:00 | 2
1       | 2015-5-5 15:00 | 1

我希望将数据分组六小时,在执行此操作时,我希望将type保留为:

  • 1(如果在6小时内只有1个)
  • 2(如果在6小时内只有2个)或
  • 3(如果在6小时内同时存在1和2)

这是我的代码:

df = df.groupby(['user_id', pd.TimeGrouper(freq=(6,'H'))]).mean()

产生:

user_id | timestamp      | type
1       | 2015-5-5 12:00 | 4

但是,我希望得到3而不是4.我想知道如何替换mean()代码中的groupby以产生所需的输出?

1 个答案:

答案 0 :(得分:2)

试试这个:

In [54]: df.groupby(['user_id', pd.Grouper(key='timestamp', freq='6H')]) \
           .agg({'type':lambda x: x.unique().sum()})
Out[54]:
                             type
user_id timestamp
1       2015-05-05 12:00:00     3

PS它只适用于给定类型:(12),因为它们的总和为3

另一个数据集:

In [56]: df
Out[56]:
   user_id           timestamp  type
0        1 2015-05-05 12:30:00     1
1        1 2015-05-05 14:00:00     1
2        1 2015-05-05 15:00:00     1
3        1 2015-05-05 20:00:00     1

In [57]: df.groupby(['user_id', pd.Grouper(key='timestamp', freq='6H')]).agg({'type':lambda x: x.unique().sum()})
Out[57]:
                             type
user_id timestamp
1       2015-05-05 12:00:00     1
        2015-05-05 18:00:00     1