繁体   English   中英

如何使用字符串(或其他某种元数据)中的逻辑将新列添加到(PySpark)Dataframe?

[英]How do I add new a new column to a (PySpark) Dataframe using logic from a string (or some other kind of metadata)?

我正在尝试使用存储在其他位置的逻辑将新列动态添加到数据框。

我希望能够遍历数组或lsit中包含的新列名和新列逻辑,并将这些值用作withColumn函数中的参数。

使用来自泰坦尼克号数据集的示例数据帧,我一直试图使用exec()函数执行字符串,并使用字符串中定义的逻辑用列创建新的数据帧。

#create the spark titanic dataframe
import pandas as pd

data1 = {'PassengerId': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
         'Name': {0: 'Owen', 1: 'Florence', 2: 'Laina', 3: 'Lily', 4: 'William'},
         'Sex': {0: 'male', 1: 'female', 2: 'female', 3: 'female', 4: 'male'},
         'Survived': {0: 0, 1: 1, 2: 1, 3: 1, 4: 0}}

df1 = spark.createDataFrame(pd.DataFrame(data1, columns=data1.keys()))
df1.show()

下面的函数采用旧的数据框名称,新的列名称以及用于计算新列的逻辑。 该函数创建字符串:df3 = df1.withColumn('diff_PassengerId',df1.PassengerId)

然后该函数执行字符串。

def testfunc(dfname,colname,col_logic):
  print("datafram:",dfname,"colname:",colname,"collogic",col_logic)
  string="df3="+dfname+".withColumn("+"'diff_PassengerId'"+","+col_logic+")"
  print(string)
  return exec(string)

testfunc('df1','diff_PassengerId','df1.PassengerId+1')

df3.show()

我希望使用新列“ diff_PassangerId”创建一个新的数据框df3。

但是相反,我得到执行错误:

NameError: name 'df3' is not defined
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<command-3662686508692761> in <module>()
      9 
     10 #df3=df1.withColumn('diff_PassengerId',df1.PassengerId)
---> 11 df3.show()

NameError: name 'df3' is not defined

我在字符串中使用show()函数时,即string =“ df3 =” + dfname +“。withColumn(” +“'diff_PassengerId'” +“,” + col_logic +“)。show()”)

它将打印数据框。 因此,正在执行字符串。 但是,不会在exec函数外部创建df3数据帧。

任何帮助将不胜感激。 非常感谢。

原因之一可能是因为您没有将任何数据帧传递给函数, df3 = dfname.withColumn(...)想要执行df3 = dfname.withColumn(...)

一种选择是删除功能并执行以下操作

dfname,colname,col_logic = 'df1','diff_PassengerId','df1.PassengerId+1'
string="df3="+dfname+".withColumn("+"'diff_PassengerId'"+","+col_logic+")"
exec(string)
df3.show()

或将执行移到函数外:

def testfunc(dfname,colname,col_logic):
    print("datafram:",dfname,"colname:",colname,"collogic",col_logic)
    string="df3="+dfname+".withColumn("+"'diff_PassengerId'"+","+col_logic+")"
    print(string)
#     exec(string)
    return string
exec(testfunc('df1','diff_PassengerId','df1.PassengerId+1'))
df3.show()

在这两种情况下,您都会得到以下输出:

+-----------+--------+------+--------+----------------+
|PassengerId|    Name|   Sex|Survived|diff_PassengerId|
+-----------+--------+------+--------+----------------+
|          1|    Owen|  male|       0|               2|
|          2|Florence|female|       1|               3|
|          3|   Laina|female|       1|               4|
|          4|    Lily|female|       1|               5|
|          5| William|  male|       0|               6|
+-----------+--------+------+--------+----------------+

或将数据框作为输入传递给函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM