簡體   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