Pyspark如何将一列与数据框中另一列的结果相乘?

Posted

技术标签:

【中文标题】Pyspark如何将一列与数据框中另一列的结果相乘?【英文标题】:Pyspark how to multiply one column with the result from another column -count in dataframe? 【发布时间】:2020-11-04 07:41:40 【问题描述】:

我有这个 DF salesDF:

+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
|customer_id|customer_name|   email_address|shipping address|product_id|product_name|product_Category|qty|unit_price|          Timestamp|
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
|        301|       Jaison|jaison@gmail.com|       Bangalore|       402|      Laptop|     Electronics|  2|     28000|2017-03-10 07:29:00|
|        321|         Abji| Abhji@gmail.com|       Bangalore|       402|      Laptop|     Electronics|  2|     28000|2017-03-12 10:29:00|
|        302|          Tom|   tom@gmail.com|       Bangalore|       601|      Mobile|     Electronics|  1|     20000|2017-03-10 08:29:00|
|        303|       Thomas|thomas@gmail.com|         Chennai|       402|      Laptop|     Electronics|  2|     38000|2017-03-10 08:45:00|
|        307|        Vijay| vijay@gmail.com|         Chennai|       503|          TV|     Electronics|  1|     42000|2017-03-11 09:45:00|
|        310|       Thomas|thomas@gmail.com|         Chennai|       503|          TV|     Electronics|  1|     42000|2017-03-12 09:45:00|
|        308|        Menon| menon@gmail.com|       Hyderabad|       503|          TV|     Electronics|  2|     40000|2017-03-13 09:45:00|
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+

我正在查找当天售出的产品总数。 客户每天购买的产品数量不同 所以我们必须计算相同产品的总数*数量

低于我试图得到的计数

sale_of_product_in_a_day =sales_df.groupBy(F.substring('Timestamp', 0,10).alias('Per Day'),'product_name').count()

这基本上给出了结果

+----------+------------+-----+
|   Per Day|product_name|count|
+----------+------------+-----+
|2017-03-12|      Laptop|    1|
|2017-03-13|          TV|    1|
|2017-03-12|          TV|    1|
|2017-03-10|      Mobile|    1|
|2017-03-10|      Laptop|    2|
|2017-03-11|          TV|    1|
+----------+------------+-----+

以上结果基于同一产品的分组,没有考虑“数量”列。 所以我需要根据客户当天购买的实际产品数量来计算“数量”?

所以在这种情况下,日期“2017-03-10”的预期结果应该是“4”而不是“2”,因为“笔记本电脑”的“数量”是 4

预期

|2017-03-10|      Laptop|    2| # should be ---> 4

那么如何将一列与数据框中的计数结果相乘?或者解决这个问题的方法是什么?

如果有人可以提供帮助,请不胜感激。

谢谢

【问题讨论】:

您能否检查一下并告诉我们该解决方案是否适合您?如果您能接受并投票赞成答案,将不胜感激。 【参考方案1】:

这应该是适合您的解决方案,只需使用 groupBy()sum()

在此处创建 DF

    df = spark.createDataFrame([("2017-03-10","Laptop", 2),("2017-03-12","Laptop", 2),("2017-03-10","Mobile", 1),("2017-03-10","Laptop", 2),("2017-03-11","TV",1),("2017-03-12","TV",1),("2017-03-13","TV",2)],[ "col1","col2", "qty"])
df.show(truncate=False)
df_grp =df.groupBy("col1", "col2").agg(F.sum("qty").alias("tot_qty"))
df_grp.show()

输入

    +----------+------+---+
|col1      |col2  |qty|
+----------+------+---+
|2017-03-10|Laptop|2  |
|2017-03-12|Laptop|2  |
|2017-03-10|Mobile|1  |
|2017-03-10|Laptop|2  |
|2017-03-11|TV    |1  |
|2017-03-12|TV    |1  |
|2017-03-13|TV    |2  |
+----------+------+---+

输出

+----------+------+-------+
|      col1|  col2|tot_qty|
+----------+------+-------+
|2017-03-12|Laptop|      2|
|2017-03-13|    TV|      2|
|2017-03-12|    TV|      1|
|2017-03-10|Mobile|      1|
|2017-03-10|Laptop|      4|
|2017-03-11|    TV|      1|
+----------+------+-------+

【讨论】:

谢谢@dsk .. 它成功了.. 所以理想情况下,当我们对列进行分组时,我们可以在相关列上应用总和.. 对吗? 这是一个正确的理解..为什么我的回答被否决了:(你能检查一下 嗨@dsk,我不确定投票发生了什么......你能否检查一下你是否看到答案被赞成......或者让我知道......谢谢 您只需要点击上箭头按钮 - 左侧

以上是关于Pyspark如何将一列与数据框中另一列的结果相乘?的主要内容,如果未能解决你的问题,请参考以下文章

根据火花数据框中另一列的值查找列的最大值?

用 pandas 数据框中另一列的值填充多列中的 Na

基于sql中另一列的一列中的最大数据

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

如何根据火花DataFrame中另一列的值更改列的值

如何选择与 PostgreSQL 中另一列的最高值的唯一列值对对应的行?