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

有没有任何pyspark UDF函数或内置函数可用于在dataframe中添加新列并基于行值进行行级操作?

尹承泽
2023-03-14

我有一个这样的数据帧:

    | col1 | col2 |
    --------------
    | a    | 1    |
    | a    | 2    |
    | b    | 3    |
    | c    | 4    |
    | a    | 5    |

现在,我需要创建新的列“col3”,并且我必须根据col1值在col3中放入新值。生成的数据框如下所示。

比如,如果col1的值为“a”,那么col3中应该有“apple”。如果col1的值为“b”,那么col3中应该有“banana”。如果col1的值为“c”,那么col3中应该有“custard”。

注:col2为正常列,请不要考虑。

    | col1 | col2 | col3    |
    ------------------------
    | a    | 1    |apple    |
    | a    | 2    |apple    |
    | b    | 3    |banana   |
    | c    | 4    |custard  |
    | a    | 5    |apple    |

我可以得到任何PYSpark UDF或内置函数?

提前感谢!!!

共有2个答案

赵星华
2023-03-14
from pyspark.sql import SparkSession
spark=SparkSession.builder.appName("test").getOrCreate()
data=[('a',1),('a',2),('b',3),('c',4),('a',5)]
headers = ("col1", "col2")
df=spark.createDataFrame(data,headers)
df.show(truncate=0)

#defining UDF
keywords = {
'a': 'apple',
'b': 'banana',
'c': 'custard'
}

def words(col1Value):
    return keywords.get(col1Value, "Not Found ! ")

from pyspark.sql.functions import udf
from pyspark.sql.types import *
#Converting function to UDF 
convertUDF = udf(lambda z: words(z),StringType())

import pyspark.sql.functions as F
finaloutput=df.withColumn("col3", convertUDF(df['col1']))
finaloutput.show(truncate=0)

数据图表记录:

+----+----+
|col1|col2|
+----+----+
|a   |1   |
|a   |2   |
|b   |3   |
|c   |4   |
|a   |5   |
+----+----+

输出:

+----+----+-------+
|col1|col2|col3   |
+----+----+-------+
|a   |1   |apple  |
|a   |2   |apple  |
|b   |3   |banana |
|c   |4   |custard|
|a   |5   |apple  |
+----+----+-------+
微生烨然
2023-03-14

我通过这个功能得到了答案。这可能对某人有帮助。

我使用过这个函数:

    fruits = {
'a': 'apple',
'b': 'banana',
'c': 'custard'
}

    def X(col1Value):
        return fruits.get(col1Value, "Not Found ! ")



    df['col3']= X(col1Value)

修改变量!!!

 类似资料:
  • 我有一个Spark DataFrame,我正在尝试基于以前的列创建一个新列,但对我来说,困难的是我已经按行计算了列的值。例如: 列1 |列2 |列3 1 | 2 | 3 4|5|0 3 | 1 | 1 因此,我想要一个新列,每行具有表达式 max(col1, col2, col3)的列名。所以,所需的输出: Col1 |Col2 |Col3 |Col4 1|2|3|'col3' 4|5|0|'co

  • 我将如何从从excel文件创建的Dataframe中提取列与特定值匹配的行? 以下是Dataframe中的几行: 这是我用来读取excel文件的代码,选择我需要的列并适当地重命名它们: 到目前为止,根据诸如这个、这个或这里的答案,我只能返回第一个索引,其中Food=“Total fruit”。当我尝试上述其他方法时,我只得到列名,例如: 我对熊猫不熟悉,看不出哪里出了问题。为什么我可以提取第一行食

  • 我想将我的自定义函数(它使用if-else梯形)应用到数据帧每行中的这六列(,,,,,)。 我已经尝试了不同的方法从其他问题,但似乎仍然不能找到正确的答案,我的问题。关键的一点是,如果这个人被算作西班牙裔,他们就不能算作其他任何东西。即使他们在另一个种族栏中有一个“1”,他们仍然被算作西班牙裔,而不是两个或两个以上的种族。类似地,如果所有ERI列的总和大于1,则被计为两个或两个以上的种族,不能被计

  • 我想写一个函数,迭代通过一个帐户列表,每个帐户都有一个相关联的值,并分配该帐户与名称列表中的一个名称。名称列表将有相关联的值,我希望分配的名称是具有最小值的名称。 我想的是迭代帐户列表,看看名字列表。首先看acc1,将其分配给名字列表的最小值。acc1的名字变成杰西卡,杰西卡的总价值被acc1值增强...杰西卡变成27,然后acc2去杰西卡再次使杰西卡35,acc3然后找到马特谁是现在的最小,并相

  • 问题内容: 我正在尝试转换DataFrame,以便将某些行复制给定的次数。例如: 应该转换为: 这与使用count函数进行聚合相反。有没有一种简单的方法可以在熊猫中实现(不使用for循环或列表推导)? 一种可能是允许函数返回多行(的类似方法)。但是,我认为现在在大熊猫中是不可能的。 问题答案: 您可以使用groupby: 所以你得到 您可以根据需要固定结果的索引