如何访问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() 我得到像 Column 另外,print(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 - 如何根据列中的两个值从数据框中过滤出连续的行块

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

如何在 PySpark 中为数据框中的所有列替换字符串值与 NULL?

在数据框中动态添加列,列名作为 List 中的元素

使用 pyspark 将 Spark 数据框中的列转换为数组 [重复]