Pyspark: есть ли способ создать сводную таблицу (или фрейм данных) путем объединения нескольких строк в одну? - PullRequest
0 голосов
/ 03 февраля 2020

Я создал следующий фрейм данных, анализируя несколько CSV-файлов в искре. Мне нужно сгруппировать средние продажи каждого месяца для каждого города для каждого SKU в год.

<table><tbody><tr><th>city</th><th>sku_id</th><th>year</th><th>month</th><th>avg_sales</th></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>Jan</td><td>100</td></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>Feb</td><td>120</td></tr><tr><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td></tr><tr><td>Z</td><td>SKU100</td><td>2019</td><td>Dec</td><td>99</td></tr></tbody></table>

Желаемый вывод:

<table><tbody><tr><th>city</th><th>sku_id</th><th>year</th><th>Jan_avg_sales</th><th>Feb_avg_sales</th><th>..</th><th>Dec_avg_sales</th></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>100</td><td>120</td><td>..</td><td>320</td></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>98</td><td>118</td><td>..</td><td>318</td></tr><tr><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td></tr><tr><td>Z</td><td>SKU100</td><td>2019</td><td>99</td><td>114</td><td>..</td><td>314</td></tr></tbody></table>

Я выполнил создание сводной таблицы, используя словарь python, но я не убежден в этом решении.

Вот фрагмент кода, который я пробовал до сих пор: path = "s3a: // bucket / city1 *" cleaned_df = spark.read.format ('csv'). Options (header = 'true', inferSchema = 'true'). load (путь) cleaned_df = cleaned_df.groupby (['Year', 'city', 'sku_id']). mean () cleaned_df.coalesce (1) .write.format ("com.databricks. spark.csv "). option (" header "," true "). save (" mydata4csv ")

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Вы пытались сгруппировать их по трем атрибутам (город, SKU, год)?

0 голосов
/ 03 февраля 2020

Если у вас есть фрейм данных, который выглядит как:

   avg_sales city sku_id  year
0        300    A   sku1  2017
1        210    A   sku1  2018
2        200    A   sku2  2017
3         10    A   sku2  2017
4         10    B   sku1  2017
5        190    B   sku1  2017
6        130    B   sku2  2017
7        130    B   sku2  2017
8         50    C   sku2  2017

Тогда вы можете сделать:

dataframe.groupby(['year', 'city', 'sku']).mean()

И получить:

                  avg_sales
city sku_id year           
A    sku1   2017        300
            2018        210
     sku2   2017        105
B    sku1   2017        100
     sku2   2017        130
C    sku2   2017         50

Если вы поделитесь Ваш python код Я могу подправить ответ, чтобы соответствовать вашему делу.

...