簡體   English   中英

Pyspark dataframe 將 function 應用到一行並將行添加到 Z6A8064B5DF4794555700C 的底部

[英]Pyspark dataframe apply function to a row and add row to bottom of dataframe

我有一個只有一行的df。

id   |id2  |score|score2|
----------------------
0    |1    |4    |2     |

我想在底部添加一行百分比,即每個數字除以 7

0/7  |1/7  |4/7  |2/7   |

但我想出的解決方案非常慢

temp = [i/7 for i in df.collect()[0]]
row = sc.parallelize(Row(temp)).toDF()
df.union(row)

這花了 21 秒運行,幾乎都是最后兩行代碼。 有一個更好的方法嗎? 我的另一個想法是轉置表格,然后可以使用 df.withColumn() 輕松完成。 理想情況下,我還想用 0 過濾掉列,但我還沒有真正研究過

看看這個,讓我知道它是否有幫助

 from pyspark.sql import SparkSession
 from pyspark.sql import functions as F

 spark = SparkSession.builder \
.appName('practice')\
.getOrCreate()

 sc= spark.sparkContext

 df = sc.parallelize([
(0,1,4,2)]).toDF(["id", "id2","score","score2"])


df2 = df.select(*[(F.col(column)/7).alias(column) for column in df.columns])

df3 = df.union(df2)

df3.show()
+---+-------------------+------------------+------------------+
| id|                id2|             score|            score2|
+---+-------------------+------------------+------------------+
|0.0|                1.0|               4.0|               2.0|
|0.0|0.14285714285714285|0.5714285714285714|0.2857142857142857|
+---+-------------------+------------------+------------------+

如果你想。 過濾掉具有 0 的列,您可以使用下面的代碼

non_zero_cols  = [c for c in df.columns if df[[c]].first()[c] > 0]

df1 = df.select(*non_zero_cols)

df2 = df1.select(*[(F.col(column)/7).alias(column) for column in 
df1.columns])

df3 = df1.union(df2)

df3.show()

+-------------------+------------------+------------------+
|                id2|             score|            score2|
+-------------------+------------------+------------------+
|                1.0|               4.0|               2.0|
|0.14285714285714285|0.5714285714285714|0.2857142857142857|
+-------------------+------------------+------------------+

請檢查以下代碼以獲取具有類型列的 df

non_zero_cols  = [c for c in df.columns if df[[c]].first()[c] > 0]

df1 = df.select(*non_zero_cols, F.lit('count').alias('type') )

df2 = df1.select(*[(F.col(column)/7).alias(column) for column in 
df1.columns if not column=='type'], F.lit('percent').alias('type'))

df3 = df1.union(df2)

df3.show()

+-------------------+------------------+------------------+-------+
|                id2|             score|            score2|   type|
+-------------------+------------------+------------------+-------+
|                1.0|               4.0|               2.0|  count|
|0.14285714285714285|0.5714285714285714|0.2857142857142857|percent|
+-------------------+------------------+------------------+-------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM