ブランド、色、評価の3つの列を持つデータフレームがあります。
values = [('Lacoste', 'Red', 6), ('Gap', 'Orange', 8), ('Lacoste', 'Green', 5),
('Gap', 'Red', 3), ('Gap', 'Orange', 5), ('Lacoste', 'Green', 3),
('Lacoste', 'Orange', 9), ('Lacoste', 'Red', 4), ('Gap', 'Green', None),
('Lacoste', 'Red', None), ('Gap', 'Orange', 5), ('Lacoste', 'Green', None),
('Banana Republic', 'Orange', None)]
ratings = spark.createDataFrame(values, ['Brand', 'Color', 'Rating'])
ratings.show()
#+---------------+------+------+
#| Brand| Color|Rating|
#+---------------+------+------+
#| Lacoste| Red| 6|
#| Gap|Orange| 8|
#| Lacoste| Green| 5|
#| Gap| Red| 3|
#| Gap|Orange| 5|
#| Lacoste| Green| 3|
#| Lacoste|Orange| 9|
#| Lacoste| Red| 4|
#| Gap| Green| null|
#| Lacoste| Red| null|
#| Gap|Orange| 5|
#| Lacoste| Green| null|
#|Banana Republic|Orange| null|
#+---------------+------+------+
期待される出力:
null以外のすべてのラコステアイテムの平均評価は(6 + 5 + 3 + 9 + 4)/ 5 = 5.4です。Lacosteブランドのすべてのnull評価値は5.4に設定する必要があります。
null以外のすべてのギャップアイテムの平均評価は(8 + 3 + 5 + 5)/ 4 = 5.25です。Gapブランドのすべてのnull評価値は5.25に設定する必要があります。
null以外のバナナリパブリックのアイテムの平均評価はないため、代わりに色で集計します。null以外のすべてのオレンジ色のアイテムの平均評価は(8 + 5 + 9 + 5)/ 4 = 6.75であるため、オレンジ色のnull以外のバナナリパブリックアイテムを6.75に設定します。
これは、条件ステートメントを使用して、このデータフレーム内のnullの1つの計算されたデータフレームからの値を入力する試みです。
brand_agg=ratings.groupBy("Brand").agg(avg("Rating").alias('Mean'))
brand_agg.show()
#+---------------+----+
#| Brand|Mean|
#+---------------+----+
#| Gap|5.25|
#| Lacoste| 5.4|
#|Banana Republic|null|
#+---------------+----+
# this fails miserably
testing_df = ratings.withColumn('Rating',
when((ratings.Rating.isNull()) &
(brand_agg.Brand == ratings.Brand),
brand_agg.Mean).otherwise(ratings.Rating))
単一のレコードを分離して条件付きで埋めるという非常に基本的な最初のステップでさえも苦労しています。ガイダンスに感謝します。
mean
ブランド/色のパーティションで使用し、nullではない平均が見つかるまでnullcoalesce
をに置き換えるために使用mean
できます。
from pyspark.sql import functions as F, Window
filled = ratings.withColumn(
'Rating',
F.coalesce(
F.col('Rating'),
F.mean('Rating').over(Window.partitionBy('Brand')),
F.mean('Rating').over(Window.partitionBy('Color'))
)
)
filled.show()
+---------------+------+------+
| Brand| Color|Rating|
+---------------+------+------+
| Gap|Orange| 8.0|
| Gap|Orange| 5.0|
| Gap|Orange| 5.0|
| Lacoste|Orange| 9.0|
|Banana Republic|Orange| 6.75|
| Gap| Green| 5.25|
| Lacoste| Green| 5.0|
| Lacoste| Green| 3.0|
| Lacoste| Green| 5.4|
| Gap| Red| 3.0|
| Lacoste| Red| 6.0|
| Lacoste| Red| 4.0|
| Lacoste| Red| 5.4|
+---------------+------+------+
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加