python - `df.loc`的pyspark等价?
问题描述
我正在寻找熊猫数据框的 pyspark 等价物。特别是我想对pyspark数据框做如下操作
# in pandas dataframe, I can do the following operation
# assuming df = pandas dataframe
index = df['column_A'] > 0.0
amount = sum(df.loc[index, 'column_B'] * df.loc[index, 'column_C'])
/ sum(df.loc[index, 'column_C'])
我想知道对 pyspark 数据框执行此操作的 pyspark 等效性是什么?
解决方案
SparkDataFrame
没有严格的顺序,因此索引没有意义。相反,我们使用类似 SQL 的 DSL。在这里,您将使用where
( filter
) 和select
. 如果数据看起来像这样:
import pandas as pd
import numpy as np
from pyspark.sql.functions import col, sum as sum_
np.random.seed(1)
df = pd.DataFrame({
c: np.random.randn(1000) for c in ["column_A", "column_B", "column_C"]
})
amount
将会
amount
# 0.9334143225687774
和 Spark 等效的是:
sdf = spark.createDataFrame(df)
(amount_, ) = (sdf
.where(sdf.column_A > 0.0)
.select(sum_(sdf.column_B * sdf.column_C) / sum_(sdf.column_C))
.first())
并且结果在数值上是等效的:
abs(amount - amount_)
# 1.1102230246251565e-16
您还可以使用条件:
from pyspark.sql.functions import when
pred = col("column_A") > 0.0
amount_expr = sum_(
when(pred, col("column_B")) * when(pred, col("column_C"))
) / sum_(when(pred, col("column_C")))
sdf.select(amount_expr).first()[0]
# 0.9334143225687773
看起来更像熊猫,但更冗长。
推荐阅读
- sharepoint - 使用图形 api 创建站点
- javapos - ACE 的 IBM 4690 SI AEF 扩展
- node.js - Router.use() 需要一个中间件函数,但使用 nodeJS 在 backend-server.js 中获得了一个对象
- kubernetes - 如何在 Pod 中查看应用程序日志
- dart - 颤振 - 具有透明背景的小部件
- java - 如何用 Lamda 表达式替换匿名 OnClickListener?
- gulp - 在 gulp 版本 4 中结合两个任务
- python - 有没有办法找到 DAG 中任何随机任务所花费的时间?
- angular - Angular 4:如何使用远程保存的 node_module 文件夹?
- c++ - 将 SSE 指令与 Libavcodec 一起使用