【问题标题】:Adding multiple columns in pyspark dataframe using a loop使用循环在 pyspark 数据框中添加多列
【发布时间】:2020-10-31 22:47:31
【问题描述】:

我需要在 pyspark 的数据框中添加一些列(4000)。我正在使用withColumn 函数,但出现断言错误。

df3 = df2.withColumn("['ftr' + str(i) for i in range(0, 4000)]", [expr('ftr[' + str(x) + ']') for x in range(0, 4000)])

不知道哪里出了问题。

【问题讨论】:

    标签: python dataframe pyspark


    【解决方案1】:

    我们可以使用.select() 而不是.withColumn() 来使用列表作为输入来创建类似于链接多个.withColumn() 的结果。 ["*"] 还用于选择数据框中的每个现有列。

    import pyspark.sql.functions as F

    df2:

    +---+
    |age|
    +---+
    | 10|
    | 11|
    | 13|
    +---+
    

    df3 = df2.select(["*"] + [F.lit(f"{x}").alias(f"ftr{x}") for x in range(0,10)])

    结果:

    +---+----+----+----+----+----+----+----+----+----+----+
    |age|ftr0|ftr1|ftr2|ftr3|ftr4|ftr5|ftr6|ftr7|ftr8|ftr9|
    +---+----+----+----+----+----+----+----+----+----+----+
    | 10|   0|   1|   2|   3|   4|   5|   6|   7|   8|   9|
    | 11|   0|   1|   2|   3|   4|   5|   6|   7|   8|   9|
    | 13|   0|   1|   2|   3|   4|   5|   6|   7|   8|   9|
    +---+----+----+----+----+----+----+----+----+----+----+
    

    【讨论】:

    • 与循环调用 withColumn 相比,这是一种更有效的方法!
    【解决方案2】:

    尝试做这样的事情:

    df2 = df3
    for i in range(0, 4000):
      df2 = df2.withColumn(f"ftr{i}", lit(f"frt{i}"))
    

    【讨论】:

    • 我不认为。它会。它只会添加一个字段-即最后一个——ftr3999: string (nullable = false)
    • @renjith 你真的试过运行它吗?解决方案将添加所有列。请注意,在循环内我使用的是 df2 = df2.witthColumn 而不是 df3 = df2.withColumn
    • 是的,我运行了它。我做 printschema 时的输出是这个根 |-- hashval: string (nullable = true) |-- dec_spec_str: string (nullable = false) |-- dec_spec array (nullable = true) | |-- 元素:double (containsNull = true) |-- ftr3999: string (nullable = false)
    • 它有效。没有把握。为什么我第一次尝试时它不起作用
    • @renjith 这个循环是如何为你工作的。它也不适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多