在PySp中从两个数据框中计算值

2024-06-28 20:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对PySpark(2.4)数据帧进行分组和求和,但不能一个一个地获取值。在

我有以下数据帧:

data.groupBy("card_scheme", "failed").count().show()

+----------------+------+------+
|     card_Scheme|failed| count|
+----------------+------+------+
|             jcb| false|     4|
|american express| false| 22084|
|            AMEX| false|     4|
|      mastercard|  true|  1122|
|            visa|  true|  1975|
|            visa| false|126372|
|              CB| false|     6|
|        discover| false|  2219|
|         maestro| false|     2|
|            VISA| false|    13|
|      mastercard| false| 40856|
|      MASTERCARD| false|     9|
+----------------+------+------+

我试图为每个card_方案计算公式X = false / (false + true),但最终还是得到了一个数据帧。在

我期待的是:

^{pr2}$

Tags: 数据falsetruedatashowcountvisacard
3条回答

创建数据集

myValues = [('jcb',False,4),('american express', False, 22084),('AMEX',False,4),('mastercard',True,1122),('visa',True,1975),('visa',False,126372),('CB',False,6),('discover',False,2219),('maestro',False,2),('VISA',False,13),('mastercard',False,40856),('MASTERCARD',False,9)]
df = sqlContext.createDataFrame(myValues,['card_Scheme','failed','count'])
df.show()
+----------------+------+------+
|     card_Scheme|failed| count|
+----------------+------+------+
|             jcb| false|     4|
|american express| false| 22084|
|            AMEX| false|     4|
|      mastercard|  true|  1122|
|            visa|  true|  1975|
|            visa| false|126372|
|              CB| false|     6|
|        discover| false|  2219|
|         maestro| false|     2|
|            VISA| false|    13|
|      mastercard| false| 40856|
|      MASTERCARD| false|     9|
+----------------+------+------+

方法1:这种方法会比较慢,因为它涉及到通过pivot的传输。在

^{pr2}$

{你可以使用方法。这会快得多。在

from pyspark.sql.window import Window
df = df.groupBy("card_scheme", "failed").agg(sum("count"))\
  .withColumn("X", col("sum(count)")/sum("sum(count)").over(Window.partitionBy(col('card_scheme'))))\
  .where(col('failed')== False).drop('failed','sum(count)')
df.show()

+----------------+------------------+
|     card_scheme|                 X|
+----------------+------------------+
|            VISA|               1.0|
|             jcb|               1.0|
|      MASTERCARD|               1.0|
|         maestro|               1.0|
|            AMEX|               1.0|
|      mastercard|0.9732717137548239|
|american express|               1.0|
|              CB|               1.0|
|        discover|               1.0|
|            visa|0.9846120283294506|
+----------------+------------------+

首先将根数据帧拆分为两个数据帧:

df_true = data.filter(data.failed == True).alias("df1")
df_false =data.filter(data.failed == False).alias("df2")

然后进行完全外部连接,我们可以得到最终结果:

^{pr2}$

不需要做groupby,只需要额外的两个数据帧和连接。在

data.groupBy("card_scheme").pivot("failed").agg(count("card_scheme"))应该可以。我不确定agg(count(any_column)),但线索是pivot函数。结果您将得到两个新列:false和{}。然后你可以很容易地计算x = false / (false + true)。在

相关问题 更多 >