Pyspark中给定时间窗口中的行数

我有一个PySpark数据框,其一小部分如下:

+------+-----+-------------------+-----+
|  name| type|          timestamp|score|
+------+-----+-------------------+-----+
| name1|type1|2012-01-10 00:00:00|   11|
| name1|type1|2012-01-10 00:00:10|   14|
| name1|type1|2012-01-10 00:00:20|    2|
| name1|type1|2012-01-10 00:00:30|    3|
| name1|type1|2012-01-10 00:00:40|   55|
| name1|type1|2012-01-10 00:00:50|   10|
| name5|type1|2012-01-10 00:01:00|    5|
| name2|type2|2012-01-10 00:01:10|    8|
| name5|type1|2012-01-10 00:01:20|    1|
|name10|type1|2012-01-10 00:01:30|   12|
|name11|type3|2012-01-10 00:01:40|  512|
+------+-----+-------------------+-----+

对于一个选定的时间窗口(例如,假设5 days),我想找出每个{{ 1}}。也就是说,在score之间,然后在num_values_week之间,name的{​​{1}}有多少score值(对于所有其他名称,如{{1} }等。)

我想将此信息转换为新的PySpark数据帧,该数据帧将具有列name12012-01-10 - 2012-01-142012-01-15 - 2012-01-29。我该怎么办?

在我之前问过的similar question中,我看到了当人们选择一个星期的间隔时如何获得(分数)计数。但是,在这个问题中,我想知道当人们在时间窗口中选择任何可调值(例如name2左右)时如何获得分数计数。

任何帮助将不胜感激。

ffffcccc 回答:Pyspark中给定时间窗口中的行数

pd.GrouperDataFrame.groupy一起使用:

#df['timestamp']=pd.to_datetime(df['timestamp']) #to convert to datetime
new_df=( df.groupby([pd.Grouper(key='timestamp',freq='5D'),'name'],sort=False)
          .score
          .count()
          .rename('num_values_week')
          .reset_index() )
print(new_df)

输出

   timestamp    name  num_values_week
0 2012-01-10   name1                6
1 2012-01-10   name5                2
2 2012-01-10   name2                1
3 2012-01-10  name10                1
4 2012-01-10  name11                1

GroupBy.resample

new_df=( df.groupby('name',sort=False)
           .resample('5D',on='timestamp')
           .count()
           .score
           .rename('num_values_week')
           .reset_index() )
print(new_df)

输出

     name  timestamp  num_values_week
0   name1 2012-01-10                6
1   name5 2012-01-10                2
2   name2 2012-01-10                1
3  name10 2012-01-10                1
4  name11 2012-01-10                1

如果要在原始df中创建新的列,请使用transform

df['num_values_week']=df.groupby([pd.Grouper(key='timestamp','name']).score.transform('count')
print(df)

      name   type           timestamp  score  num_values_week
0    name1  type1 2012-01-10 00:00:00     11                6
1    name1  type1 2012-01-10 00:00:10     14                6
2    name1  type1 2012-01-10 00:00:20      2                6
3    name1  type1 2012-01-10 00:00:30      3                6
4    name1  type1 2012-01-10 00:00:40     55                6
5    name1  type1 2012-01-10 00:00:50     10                6
6    name5  type1 2012-01-10 00:01:00      5                2
7    name2  type2 2012-01-10 00:01:10      8                1
8    name5  type1 2012-01-10 00:01:20      1                2
9   name10  type1 2012-01-10 00:01:30     12                1
10  name11  type3 2012-01-10 00:01:40    512                1
本文链接:https://www.f2er.com/3149501.html

大家都在问