如何得到pyspark Dataframe 中相似命名列的平均值?

plupiseo  于 2023-02-21  发布在  Spark
关注(0)|答案(2)|浏览(177)

我有12列数据包含每个客户12个月的余额,如下所示,如何创建一个额外的列与平均12个月的余额(b 0到b11)。
| 顾客|b0|b1|b2|b3|b4|b5|b6|b7|b8|b9|硼10|b11|平均值|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 客户_1|二十个|三十|零|零|零|零|零|零|零|零|零|零|二十五|
| 客户_2|三个|三个|三个|三个|三个|三个|三个|三个|三个|三个|三个|三个|三个|
| 客户_3|零|零|零|零|零|零|零|零|零|五十|三十|十个|三十|
| 客户_4|零|零|零|零|零|零|零|零|零|零|零|零|零|
我想有一个基于列名的通用代码,谢谢。

von4xj4u

von4xj4u1#

这是可行的:

df.withColumn("sum", sum(F.coalesce(F.col(col), F.lit(0)) for col in df.schema.names if col!="customer"))\
  .withColumn("count", sum([F.col(col).isNotNull().cast(IntegerType()) for col in df.schema.names if col!="customer"]))\
  .withColumn("avg", F.col("sum") / F.col("count"))\
  .show()

除了for col in df.schema.names if col!="customer"之外,如果还有customer以外的列,也可以使用for col in df.schema.names if "b" in col。可以使用任何条件来选择要平均的列,但基本思想是相同的。
输入:

输出(您可以删除中间列,我保留它们是为了便于理解):

jm2pwxwz

jm2pwxwz2#

我想我们只需要nvl列并将它们相加,然后除以12。(单元格(b 0,0)+单元格(b1,0)+...单元格(b11,0)))/12
我是不是太天真了?

相关问题