如何访问pyspark数据框中的动态列
Posted
技术标签:
【中文标题】如何访问pyspark数据框中的动态列【英文标题】:How to access dynamic column in pyspark dataframe 【发布时间】:2019-02-11 12:00:28 【问题描述】:我是 pyspark 的新手。我有一个数组中的列列表,如下所示。
input_vars = [
'column1',
'column2',
'column3',
'column4'
]
现在我想使用数据框执行以下操作。
for var in input_vars:
print(df.var.isNotNull())
但是当我尝试执行上面的代码时出现以下错误
AttributeError: 'DataFrame' object has no attribute 'var'
编辑
我已经按照 'ernest_k' 给出的建议尝试了 df[var].isNotNull() 并且上述错误得到了解决。现在我的实际要求是将下面的 pandas 数据帧代码重写为 pyspark 数据帧。
for var in input_vars:
bindt = df2[df2[var].notnull()][var].quantile([0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1]).unique()
q0 = df2[df2[var].notnull()][var].quantile(0)
q1 = df2[df2[var].notnull()][var].quantile(0.25)
q2 = df2[df2[var].notnull()][var].quantile(0.5)
q3 = df2[df2[var].notnull()][var].quantile(0.75)
q4 = df2[df2[var].notnull()][var].quantile(1)
任何人都可以帮助我如何实现上述要求。提前致谢。
【问题讨论】:
你可以使用df[var]
@ernest_k - 感谢您的回复。当我尝试 df[var].isNotNull() 我得到像 Columnprint(df.var.isNotNull())
不行,你这里有什么要求?
@Valli69 我想这些给你一个列对象。您可能想尝试df.filter(df[var].isNotNull()).show()
来查看过滤后的数据框(但在所有列上循环执行此操作可能很危险,除非您只是在小数据集上进行测试)。
@DuyNguyenHoang 其实我的要求是我想计算一个非空列的分位数。在熊猫中,我计算过 df[df[var].notnull()][var].quantile(0.25) 但不确定如何在 pyspark 数据帧中执行
【参考方案1】:
要从 DataFrame 中获取列列表,请使用 df.columns
并从那里开始处理下一步。
在Spark 2.0+,你可以使用(我不是100%保证approxQuantile(var, [0.5], 0.25)
满足你的要求,请改)
columns = df.columns
for var in input_vars:
if var in columns:
print(df.filter(' is not null'.format(var)).approxQuantile(var, [0.5], 0.25))
else:
print('Column not found'.format(var))
更多详情,请优先approxQuantile
【讨论】:
感谢您的回复,但我在 spark 1.6 中需要它。您能否在 spark 1.6 中提出建议 我明天去看看,稍后再告诉你。老实说,我以前从未这样做过以上是关于如何访问pyspark数据框中的动态列的主要内容,如果未能解决你的问题,请参考以下文章
PySpark - 如何根据列中的两个值从数据框中过滤出连续的行块
遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框