Pyspark 如何将一列与另一列的结果相乘 - 数据框中的计数?
Pyspark how to multiply one column with the result from another column -count in dataframe?
我有这个DFsalesDF
:
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
|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|
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
我要查找当天售出的产品总数。
客户每天购买不同数量的产品
所以我们必须计算相同产品的总数 * qty
低于我试图获得的计数
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|
+----------+------------+-----+
以上结果基于相同产品的分组,未考虑 'qty' 列。
所以我需要根据客户当天购买的实际产品数量计算 'qty'?
所以在这种情况下,日期“2017-03-10”的预期结果应该是“4”而不是“2”,因为 'Laptop' 的 'quantity' 是 4
预期
|2017-03-10| Laptop| 2| # should be ---> 4
那么如何将一列与数据框中的计数结果相乘?或者解决这个问题的方法是什么?
如果有人可以提供帮助,我们将不胜感激。
谢谢
这应该是适合您的解决方案,只需使用 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|
+----------+------+-------+
我有这个DFsalesDF
:
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
|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|
+-----------+-------------+----------------+----------------+----------+------------+----------------+---+----------+-------------------+
我要查找当天售出的产品总数。 客户每天购买不同数量的产品 所以我们必须计算相同产品的总数 * qty
低于我试图获得的计数
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|
+----------+------------+-----+
以上结果基于相同产品的分组,未考虑 'qty' 列。 所以我需要根据客户当天购买的实际产品数量计算 'qty'?
所以在这种情况下,日期“2017-03-10”的预期结果应该是“4”而不是“2”,因为 'Laptop' 的 'quantity' 是 4
预期
|2017-03-10| Laptop| 2| # should be ---> 4
那么如何将一列与数据框中的计数结果相乘?或者解决这个问题的方法是什么?
如果有人可以提供帮助,我们将不胜感激。
谢谢
这应该是适合您的解决方案,只需使用 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|
+----------+------+-------+