使用 pyspark/pandas 使用列名的模式匹配对具有不同列名的多个列值求和

Posted

技术标签:

【中文标题】使用 pyspark/pandas 使用列名的模式匹配对具有不同列名的多个列值求和【英文标题】:summing multiple columns values which has different column names by using pattern matching of column names using pyspark/pandas 【发布时间】:2021-11-25 15:26:06 【问题描述】:

例如: 我有一个数据框,其中的列像

lens plain-prod 102 plain-prod 105 plain-prod 107
First 1 3 4
Second 2 5 3
First 3 7 2
Second 4 8 1

所以我需要进行模式匹配 (^plain-prod.*) 并选择所有匹配的 3 列并创建新列 plain_sum,其中包含如何使用 pyspark 或 pandas 实现此目的的总和。

lens plain-prod 102 plain-prod 105 plain-prod 107 plain_sum
First 1 3 4 8
Second 2 5 3 10
First 3 7 2 12
Second 4 8 1 13

【问题讨论】:

【参考方案1】:

用 Pandas 试试这个方法(df 是你的数据框):

df['plain_sum'] = df.filter(regex='^plain-prod.*').sum(axis=1)

【讨论】:

【参考方案2】:

你可以在 PySpark 中做这样的事情:

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

spark = SparkSession.builder.getOrCreate()
data = [
    "lens": "First", "plain-prod 102": 1, "plain-prod 105": 3, "plain-prod 107": 4,
    "lens": "Second", "plain-prod 102": 2, "plain-prod 105": 3, "plain-prod 107": 4,
]
df = spark.createDataFrame(data)
df = df.withColumn(
    "plain_sum", sum([F.col(x) for x in df.columns if "plain-prod" in x])
)

结果:

+------+--------------+--------------+--------------+---------+                 
|lens  |plain-prod 102|plain-prod 105|plain-prod 107|plain_sum|
+------+--------------+--------------+--------------+---------+
|First |1             |3             |4             |8        |
|Second|2             |3             |4             |9        |
+------+--------------+--------------+--------------+---------+

【讨论】:

这会失败并返回错误 Invalid argument, not a string or column @Ajaykumar 请提供您正在运行的代码示例。 我只是通过更改数据框名称和过滤器运行相同的代码 @Ajaykumar 我猜您的原始数据集与我的测试示例不同。无论如何,我已经更新了答案,如果您需要它,也许会对您有所帮助。 你在 pyspark 中执行了你的代码吗?如果不尝试,您将收到您创建的示例数据框的错误消息

以上是关于使用 pyspark/pandas 使用列名的模式匹配对具有不同列名的多个列值求和的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark.pandas 中添加/减去日期时间

将 pyspark pandas_udf 与 AWS EMR 一起使用时出现“没有名为‘pandas’的模块”错误

PySpark pandas_udfs java.lang.IllegalArgumentException错误

pyspark pandas 对象作为数据框 - TypeError

在 PySpark Pandas UDF 中指定用户定义函数的正确方法

如何从 Snowflake SQL 查询创建 PySpark pandas-on-Spark DataFrame?