Форум сайта python.su
приветствую
есть df вида (упрощенно):
| class | name | sum | year | ----------------------- | a | abc | 123 | 1999 | | a | def | 125 | 1999 | | a | ikl | 127 | 1999 | | a | mn | 201 | 2000 | | a | opr | 202 | 2000 |
| class| 1999 | 2000 | --------------------- | a | ikl | opr |
#размерность по оси Х: Х=df.select('year').distinct() #размерность по оси Y (в нашем примере это единственное значение): Y=df.select('class').distinct() #создаем df результата: st=StructField('class', StringType(), True) schema =StructType().add(st) for i in X.collect(): st=StructField(str(i[0]), StringType(), True) schema =schema.add(st) rez=sc.createDataFrame([], schema) for i0 in Y.collect(): a=i0[0] sz=[(a)] #накладываем фильтр по class df2=df.filter(df.class==a) i1=0 while i1<=X.count()-1: year=X.collect()[i1][0] #текущее значение по Х #накладываем фильтр по year df3=df2.filter(df2.year==year) #далее при помощи метода из библиотеки Pandas: pd=df3.toPandas() max=pd.loc[pd['sum']==pd['sum'].max()] name=max['name'].values[0] sz.append(name) i1=i1+1 #Добавляем строку в rez: st=sc.createDataFrame(Row(sz), schema) rez=rez.unionByName(st)
Отредактировано pe1601@mail.ru (Ноя. 17, 2022 20:50:03)
Офлайн
Правильный подход:
Используй SQL диалект для подобных запросов. Это будет много меньше кода и времени оббработки
Пример по ссылке что давали раньше.
Офлайн