Python 尝试应用lambda创建新列时,“'DataFrame'对象没有属性'apply'”

Python 尝试应用lambda创建新列时,“'DataFrame'对象没有属性'apply'”,python,pyspark,apache-spark-sql,pyspark-sql,Python,Pyspark,Apache Spark Sql,Pyspark Sql,我的目标是在Pandas数据帧中添加一个新列,但我面临一个奇怪的错误 新列应该是现有列的转换,可以在字典/哈希映射中进行查找 # Loading data df = sqlContext.read.format(...).load(train_df_path) # Instanciating the map some_map = { 'a': 0, 'b': 1, 'c': 1, } # Creating a new column using the map df[

我的目标是在Pandas数据帧中添加一个新列,但我面临一个奇怪的错误

新列应该是现有列的转换,可以在字典/哈希映射中进行查找

# Loading data
df = sqlContext.read.format(...).load(train_df_path)

# Instanciating the map
some_map = {
    'a': 0, 
    'b': 1,
    'c': 1,
}

# Creating a new column using the map
df['new_column'] = df.apply(lambda row: some_map(row.some_column_name), axis=1)
这将导致以下错误:

AttributeErrorTraceback (most recent call last)
<ipython-input-12-aeee412b10bf> in <module>()
     25 df= train_df
     26 
---> 27 df['new_column'] = df.apply(lambda row: some_map(row.some_column_name), axis=1)

/usr/lib/spark/python/pyspark/sql/dataframe.py in __getattr__(self, name)
    962         if name not in self.columns:
    963             raise AttributeError(
--> 964                 "'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
    965         jc = self._jdf.apply(name)
    966         return Column(jc)

AttributeError: 'DataFrame' object has no attribute 'apply'
其他可能有用的信息:
*我正在使用Spark和Python 2。

您有一个Spark数据帧,而不是pandas数据帧。要向spark数据框添加新列,请执行以下操作:

import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType
df = df.withColumn('new_column', F.udf(some_map.get, IntegerType())(some_column_name))
df.show()

您有一个spark数据帧,而不是pandas数据帧。要向spark数据框添加新列,请执行以下操作:

import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType
df = df.withColumn('new_column', F.udf(some_map.get, IntegerType())(some_column_name))
df.show()

您正在使用的语法用于数据帧。要为spark数据帧实现这一点,应使用withColumn方法。这适用于范围广泛的定义良好的映射函数,但对于用户定义的映射函数来说,它稍微复杂一些

一般情况 要定义自定义项,需要指定输出数据类型。例如,如果要应用返回字符串的函数my_func,可以按如下方式创建udf:

导入pyspark.sql.f函数 my_udf=f.udfmy_func,StringType 然后,您可以使用my_udf创建一个新列,如:

df=df.withColumn'new\u column',my\u udff.colsome\u column\u name 另一个选项是使用选择:

df=df.select*,my\u udff.colsome\u column\u name.aliasnew\u column 具体问题 使用自定义项

在您的特定情况下,您希望使用字典来翻译数据帧的值

以下是为此目的定义自定义项的方法:

some_map_udf=f.udflambda x:some_map.getx,None,IntegerType 请注意,我使用dict.get是因为您希望您的udf对错误输入具有健壮性

df=df.withColumn'new\u column',some\u map\u udff.colsome\u column\u name 使用数据帧函数

有时使用udf是不可避免的,但只要可能,通常首选使用数据帧函数

这里有一个不使用udf做同样事情的选项

诀窍是迭代某些映射中的项以创建函数列表

some_map_func=[f.whenf.colsome_column_name==k,v代表k,v在某些_map.items中] 打印一些映射函数 [专栏, 柱 [栏目] 现在,您可以在选择中使用:

df=df.select*,f.coalesce*某些映射函数别名某些列名称
这是因为如果不满足条件,when默认返回null,而coalesce将选择它遇到的第一个非null值。由于映射的键是唯一的,因此最多有一列是非空的。

您使用的语法用于数据帧。要为spark数据帧实现这一点,应使用withColumn方法。这适用于范围广泛的定义良好的映射函数,但对于用户定义的映射函数来说,它稍微复杂一些

一般情况 要定义自定义项,需要指定输出数据类型。例如,如果要应用返回字符串的函数my_func,可以按如下方式创建udf:

导入pyspark.sql.f函数 my_udf=f.udfmy_func,StringType 然后,您可以使用my_udf创建一个新列,如:

df=df.withColumn'new\u column',my\u udff.colsome\u column\u name 另一个选项是使用选择:

df=df.select*,my\u udff.colsome\u column\u name.aliasnew\u column 具体问题 使用自定义项

在您的特定情况下,您希望使用字典来翻译数据帧的值

以下是为此目的定义自定义项的方法:

some_map_udf=f.udflambda x:some_map.getx,None,IntegerType 请注意,我使用dict.get是因为您希望您的udf对错误输入具有健壮性

df=df.withColumn'new\u column',some\u map\u udff.colsome\u column\u name 使用数据帧函数

有时使用udf是不可避免的,但只要可能,通常首选使用数据帧函数

这里有一个不使用udf做同样事情的选项

诀窍是迭代某些映射中的项以创建函数列表

some_map_func=[f.whenf.colsome_column_name==k,v代表k,v在某些_map.items中] 打印一些映射函数 [专栏, 柱 [栏目] 现在,您可以在选择中使用:

df=df.select*,f.coalesce*某些映射函数别名某些列名称
这是因为如果不满足条件,when默认返回null,而coalesce将选择它遇到的第一个非null值。由于映射的键是唯一的,最多有一列是非空的。

我认为这不是一个数据帧。该错误是由Spark数据帧引发的?您在脚本中是否定义了名为apply的变量?@user2285236这可能就是我感到困惑的原因。你知道如何在spark的情况下应用lambda吗?@Harv Ipan不,我没有名为apply的变量。我的目标是运行一个lambda来创建一个新的列。我认为这不是熊猫数据帧。该错误是由Spark数据帧引发的?您是否在脚本中的某个地方定义了变量
名为apply?@user2285236这可能就是我感到困惑的原因。你知道如何在spark的情况下应用lambda吗?@Harv Ipan不,我没有名为apply的变量。我的目标是运行lambda以创建一个新列。