>

다른 곳에 저장된 논리를 사용하여 동적으로 데이터 프레임에 새 열을 추가하려고합니다.

배열 또는 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 ()")

데이터 프레임을 인쇄합니다. 따라서 문자열이 실행되고 있습니다. 그러나 df3 데이터 프레임은 exec 함수 외부에서 작성되지 않습니다.

도움을 주시면 감사하겠습니다. 많은 감사합니다.

  • 답변 # 1

    한 가지 이유는 함수에 데이터 프레임을 전달하지 않고 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|
    +-----------+--------+------+--------+----------------+
    
    

    또는 입력으로 함수에 데이터 프레임을 전달하십시오.

관련 자료

  • 이전 c++ - 객체를 어떻게 복사합니까?
  • 다음 앱 라이브러리 및 Android 라이브러리 유형의 다른 모듈에서 룸 데이터베이스의 여러 인스턴스 생성