![](/img/trans.png)
[英]How do I add a new column to a Spark DataFrame (using PySpark)?
[英]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.