查找每列 Pyspark 的比率
Finding Ratio of Every Column Pyspark
假设我有以下 DF。
df = sqlContext.createDataFrame(sc.parallelize(
[('a',0, 1,1), ('b',1, 3,4), ('c',2, 5,7)]), ('acc_no','col_1', 'col_2','sum'))
+------+-----+-----+---+
|acc_no|col_1|col_2|sum|
+------+-----+-----+---+
| a| 0| 1| 1|
| b| 1| 3| 4|
| c| 2| 5| 7|
+------+-----+-----+---+
我想为 col_1 和 col_2 的百分比创建一个新列总和列如下。
+------+-----+-----+---+---------+---------+
|acc_no|col_1|col_2|sum|perc_col1|perc_col2|
+------+-----+-----+---+---------+---------+
| a| 0| 1| 1| 0| 100|
| b| 1| 3| 4| 25| 75|
| c| 2| 5| 7| 29| 71|
+------+-----+-----+---+---------+---------+
我知道我可以使用以下代码为每个 col_1 和 col_2
添加百分比列
df.withColumn('perc_col1',col('col_1')/col('sum')*100).withColumn('perc_col2',col('col_2')/col('sum')*100).show()
但是如果我有 数百 列并且我想避免编写数百行代码,我该怎么做呢?
而不是 withcolumn
,在这种情况下,您可以使用带有 df.select
的 for 循环,并使用 .alias
和 f-strings
重命名
col_list = ['col_1','col_2'] #list of multiple columns
out = df.select("*",*[F.round((F.col(i)/F.col("sum"))*100,2).alias(f"perc_{i}")
for i in col_list])
out.show()
+------+-----+-----+---+----------+----------+
|acc_no|col_1|col_2|sum|perc_col_1|perc_col_2|
+------+-----+-----+---+----------+----------+
| a| 0| 1| 1| 0.0| 100.0|
| b| 1| 3| 4| 25.0| 75.0|
| c| 2| 5| 7| 28.57| 71.43|
+------+-----+-----+---+----------+----------+
或者循环 withcolumn:
col_list = ['col_1','col_2']
for i in col_list:
df = df.withColumn(f"perc_{i}",F.round((F.col(i)/F.col("sum"))*100,2))
df.show()
假设我有以下 DF。
df = sqlContext.createDataFrame(sc.parallelize(
[('a',0, 1,1), ('b',1, 3,4), ('c',2, 5,7)]), ('acc_no','col_1', 'col_2','sum'))
+------+-----+-----+---+
|acc_no|col_1|col_2|sum|
+------+-----+-----+---+
| a| 0| 1| 1|
| b| 1| 3| 4|
| c| 2| 5| 7|
+------+-----+-----+---+
我想为 col_1 和 col_2 的百分比创建一个新列总和列如下。
+------+-----+-----+---+---------+---------+
|acc_no|col_1|col_2|sum|perc_col1|perc_col2|
+------+-----+-----+---+---------+---------+
| a| 0| 1| 1| 0| 100|
| b| 1| 3| 4| 25| 75|
| c| 2| 5| 7| 29| 71|
+------+-----+-----+---+---------+---------+
我知道我可以使用以下代码为每个 col_1 和 col_2
添加百分比列df.withColumn('perc_col1',col('col_1')/col('sum')*100).withColumn('perc_col2',col('col_2')/col('sum')*100).show()
但是如果我有 数百 列并且我想避免编写数百行代码,我该怎么做呢?
而不是 withcolumn
,在这种情况下,您可以使用带有 df.select
的 for 循环,并使用 .alias
和 f-strings
col_list = ['col_1','col_2'] #list of multiple columns
out = df.select("*",*[F.round((F.col(i)/F.col("sum"))*100,2).alias(f"perc_{i}")
for i in col_list])
out.show()
+------+-----+-----+---+----------+----------+
|acc_no|col_1|col_2|sum|perc_col_1|perc_col_2|
+------+-----+-----+---+----------+----------+
| a| 0| 1| 1| 0.0| 100.0|
| b| 1| 3| 4| 25.0| 75.0|
| c| 2| 5| 7| 28.57| 71.43|
+------+-----+-----+---+----------+----------+
或者循环 withcolumn:
col_list = ['col_1','col_2']
for i in col_list:
df = df.withColumn(f"perc_{i}",F.round((F.col(i)/F.col("sum"))*100,2))
df.show()