Транспонировать датафрейм в Pyspark - PullRequest
0 голосов
/ 24 ноября 2018

Как я могу сделать, чтобы транспонировать следующий фрейм данных в Pyspark?

Идея заключается в достижении результата, который показан ниже.

import pandas as pd

d = {'id' : pd.Series([1, 1, 1, 2, 2, 2, 3, 3, 3], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
     'place' : pd.Series(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
     'value' : pd.Series([10, 30, 20, 10, 30, 20, 10, 30, 20], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
     'attribute' : pd.Series(['size', 'height', 'weigth', 'size', 'height', 'weigth','size', 'height', 'weigth'], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])}

   id place  value attribute
a   1     A     10      size
b   1     A     30    height
c   1     A     20    weigth
d   2     A     10      size
e   2     A     30    height
f   2     A     20    weigth
g   3     A     10      size
h   3     A     30    height
i   3     A     20    weigth

d = {'id' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
     'place' : pd.Series(['A', 'A', 'A'], index=['a', 'b', 'c']),
     'size' : pd.Series([10, 30, 20], index=['a', 'b', 'c']),
     'height' : pd.Series([10, 30, 20], index=['a', 'b', 'c']),
     'weigth' : pd.Series([10, 30, 20], index=['a', 'b', 'c'])}

df = pd.DataFrame(d)
print(df)

   id place  size  height  weigth
a   1     A    10      10      10
b   2     A    30      30      30
c   3     A    20      20      20

Любая помощь приветствуется.От уже большое спасибо

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

См. Документацию .Pivoting всегда выполняется в контексте агрегации, и я выбрал sum здесь.Таким образом, если для одного и того же атрибута id , place или существует несколько значений, будет взята их сумма.Вы также можете использовать мин, макс или среднее значение, в зависимости от того, что вам нужно.

df = df.groupBy(["id","place"]).pivot("attribute").sum("value")

Эта ссылка также отвечает на тот же вопрос.

0 голосов
/ 24 ноября 2018

Прежде всего, я не думаю, что ваш пример вывода правильный.Ваши входные данные имеют размер, равный 10, высоту, установленную на 30, и вес, установленный на 20 для каждого идентификатора, но в желаемом выходном наборе все равно 10 для идентификатора 1. Если это действительно то, что вы, пожалуйста, объясните это немного подробнее.Если это было ошибкой, то вы хотите использовать функцию pivot .Пример:

from pyspark.sql.functions import first
l =[( 1        ,'A', 10, 'size' ),
( 1        , 'A', 30, 'height' ),
( 1        , 'A', 20, 'weigth' ),
( 2        , 'A', 10, 'size' ),
( 2        , 'A', 30, 'height' ),
( 2        , 'A', 20, 'weigth' ),
( 3        , 'A', 10, 'size' ),
( 3        , 'A', 30, 'height' ),
( 3        , 'A', 20, 'weigth' )]

df = spark.createDataFrame(l, ['id','place', 'value', 'attribute'])

df.groupBy(df.id, df.place).pivot('attribute').agg(first("value")).show()

+---+-----+------+----+------+ 
| id|place|height|size|weigth|
+---+-----+------+----+------+ 
|  2|    A|    30|  10|    20| 
|  3|    A|    30|  10|    20| 
|  1|    A|    30|  10|    20|
+---+-----+------+----+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...