Python 3.x PySpark中的循环避免
我有一个类似于以下内容的PySpark数据帧:Python 3.x PySpark中的循环避免,python-3.x,pyspark,Python 3.x,Pyspark,我有一个类似于以下内容的PySpark数据帧: ID | value | period a | 100 | 1 a | 100 | 1 b | 100 | 1 a | 100 | 2 b | 100 | 2 a | 100 | 3 对于每个周期(1、2、3)我想过滤周期小于或等于该数字的数据,然后对每个ID的值列求和 例如,周期1给出(a:200,b:100),周期2给出(a:300,b:200),周期3
ID | value | period
a | 100 | 1
a | 100 | 1
b | 100 | 1
a | 100 | 2
b | 100 | 2
a | 100 | 3
对于每个周期(1、2、3)
我想过滤周期小于或等于该数字的数据,然后对每个ID的值列求和
例如,周期1给出(a:200,b:100)
,周期2给出(a:300,b:200)
,周期3给出(a:400,b:200)
目前,我正在做一个循环:
vals = [('a', 100, 1),
('a', 100, 1),
('b', 100, 1),
('a', 100, 2),
('b', 100, 2),
('a', 100, 3)]
cols = ['ID', 'value', 'period']
df = spark.createDataFrame(vals, cols)
for p in (1, 2, 3):
df_filter = df[df['period'] <= p]
results = df_filter.groupBy('ID').agg({'value':'sum'})
vals=[('a',100,1),
('a',100,1),
('b',100,1),
('a',100,2),
('b',100,2),
('a',100,3)]
cols=['ID','value','period']
df=spark.createDataFrame(VAL,cols)
对于(1,2,3)中的p:
df_filter=df[df['period']这里是一个使用pyspark
和pandas
的组合解决方案;既然您说了数百个周期,这可能是一个可行的解决方案;基本上先使用pyspark聚合数据帧,然后将其转换为本地pandas数据帧以进行进一步处理:
import pyspark.sql.functions as f
local_df = df.groupBy('period').pivot('ID').agg(f.sum('value')).toPandas()
local_df.sort_values('period').fillna(0).set_index('period').cumsum().reset_index()
# period a b
#0 1 200.0 100.0
#1 2 300.0 200.0
#2 3 400.0 200.0