我有一个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数据帧,该数据帧将具有列name1
,2012-01-10 - 2012-01-14
,2012-01-15 - 2012-01-29
。我该怎么办?
在我之前问过的similar question中,我看到了当人们选择一个星期的间隔时如何获得(分数)计数。但是,在这个问题中,我想知道当人们在时间窗口中选择任何可调值(例如name2
左右)时如何获得分数计数。
任何帮助将不胜感激。
答案 0 :(得分:1)
将pd.Grouper
与DataFrame.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
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',freq='5D'),'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