当前位置: 首页 > 知识库问答 >
问题:

使用withColumn函数从PySpark中的列表动态创建新列

单展
2023-03-14

我试图弄清楚如何通过使用与哥伦布()函数并在pySpark中的cp_codeset列()函数中调用udf来动态地为列表中的每个项目创建列(在这种情况下为列表)。下面是我写的代码,但它给了我一个错误。

from pyspark.sql.functions import udf, col, lit
from pyspark.sql import Row
from pyspark.sql.types import IntegerType


codeset = set(cp_codeset['CODE'])

for col_name in cp_codeset.col_names.unique():
    def flag(d):
        if (d in codeset):
            name = cp_codeset[cp_codeset['CODES']==d].col_names
            if(name==col_name):
                return 1
            else:
                return 0

    cpf_udf = udf(flag, IntegerType())

    p.withColumn(col_name, cpf_udf(p.codes)).show()

另一种选择是手动执行它,但在这种情况下,我必须编写相同的udf函数并使用养分()函数调用它75次(这是cp_codeset["col_names"]的大小)

下面是我的两个数据帧,我正在尝试获得结果如何显示

id|codes
1|100
2|102
3|104
codes| col_names
100|a
101|b
102|c
103|d
104|e
105|f
id|codes|a|c|e
1|100   |1|0|0
2|102   |0|1|0   
3|104   |0|0|1

共有2个答案

范承望
2023-03-14

我将使用get_dummiesjoinmap

m = cp_codeset.set_index('codes').col_names

P.join(pd.get_dummies(P.codes.map(m)))

   id  codes  a  c  e
0   1    100  1  0  0
1   2    102  0  1  0
2   3    104  0  0  1
卫高明
2023-03-14

过滤此数据后:

cp_codeset.set_index('codes').loc[p.codes]
Out[44]: 
      col_names
codes          
100           a
102           c
104           e

只需使用get_dummies

pd.get_dummies(cp_codeset.set_index('codes').loc[p.codes])
Out[45]: 
       col_names_a  col_names_c  col_names_e
codes                                       
100              1            0            0
102              0            1            0
104              0            0            1
 类似资料:
  • 问题内容: 我有这样的数据我想创建一个PySpark数据框 我已经用过 但我总是得到 我如何获得如下所示的结果? 问题答案: 我发现将参数视为元组列表很有用,其中列表中的每个条目对应于DataFrame中的一行,而元组的每个元素对应于一列。 您可以通过将列表中的每个元素设为元组来获得所需的输出: 或者,如果更改源很麻烦,则可以等效地执行以下操作:

  • 问题内容: 使用Spark 1.6,我有一个Spark (命名为),其值分别为A,B,C,DS,DNS,E,F,G和H,我想使用下面的值创建一个新列(例如),我该如何映射?(因此fi’A’需要映射为’S’等。) 问题答案: 使用UDF(与版本无关)的低效率解决方案: 结果: 创建文字的效率更高( Spark > = 2.0,Spark <3.0): 结果相同: 但更有效的执行计划: 与UDF版本相

  • 问题内容: 背景 我想在sql select语句中动态重命名case语句。 例如: 我想要的输出是创建的列列表,其中标签作为与“ id”列不同的id。 但是,此变量 x.id 并不是动态输出值,而是我输出的是单列x.id。 例如: 表中的列… id — c1 ---- c2 1 ---- x1 — x2 2 ---- x2 ---- x3 3 ---- x4 ---- x5 在运行查询后,期望的列

  • 如何将一个新的列事件添加到数据帧中,该事件将是< code>generate_header的结果?如何添加一行作为列值? 可能我们需要将函数转换为UDF 假设我们有这样的东西 我们想得到这个

  • 我有一个包含3列的数据表,我想使用列投影的值创建一个新列。 应该如何从投影中选择值?--它应该选择前一年投影的3个具体值--如果您要为2020年创建一个新列,它应该从2021年、2022年和2023年选择值 我已经尝试了以下SQL: spark.sql(''从表中选择serial_number,pit_pd_proj为proj1,year,lead(pit_pd_proj,3)over(parti

  • 我有一个数据框,如: 我需要为每个列应用一些函数,并在这个数据帧中创建具有特殊名称的新列。 所以我需要根据列和(如name)乘以两个额外的列,名称为和由两个。是否可以使用或其他结构来完成此操作?