2016-09-06 2 views
1

매우 간단한 작업을하고 싶지만 Python/Spark (1.5)/Dataframe에서 수행하는 방법을 이해할 수 없습니다 (모든 것이 저에게 새로운 것입니다) .Python Spark Dataframes : 다른 열의 조건을 기반으로 열을 업데이트하는 방법

원본 데이터 셋 :

code| ISO | country 
1 | AFG | Afghanistan state 
2 | BOL | Bolivia Plurinational State 

새로운 데이터 세트 :

code| ISO | country 
1 | AFG | Afghanistan 
2 | BOL | Bolivia 

나는 이런 식으로 뭔가 할 싶습니다 (의사 파이썬을?) :

iso_to_country_dict = {'AFG': 'Afghanistan', 'BOL': 'Bolivia'} 

def mapCountry(iso,country): 
    if(iso_to_country_dict[iso] is not empty): 
     return iso_to_country_dict[iso] 
    return country 

dfg = df.select(mapCountry(df['ISO'],df['country'])) 

그냥 단순에 대한 mapCountry는 다음과 같이 표시 될 수 있습니다.

그러나이와가 오류입니다 : ValueError: Cannot convert column into bool:

+0

당신은 불꽃의 열을 업데이트 할 수 없습니다. 당신은 항상 하나의 데이터 프레임을 다른 적용 가능한 로직으로 변환합니다. –

+0

예, 그게 내가하고있는 일이다. 다른 데이터 프레임 df -> dfg (더 의미있는 이름을주게되어 미안하다.) – Babu

+0

"열을 업데이트하는 방법"에 대한 질문을 언급했다. –

답변

1

글쎄, 난 해결책을 찾았지만이 그렇게하는 방법을 가장 깨끗한 방법이 있는지 알고하지 않습니다. 다른 아이디어?

iso_to_country_dict = { 'BOL': '볼리비아', 'HTI': '카보 베르데', 'COD': '콩고', 'PRK': '한국', '라오스': '라오스'}

def mapCountry(iso,country): 
    if(iso in iso_to_country_dict): 
     return iso_to_country_dict[iso] 
    return country 

mapCountry=udf(mapCountry) 

dfg = df.select(df['iso'],mapCountry(df['iso'],df['country']).alias('country'),df['C2'],df['C3'],df['C4'],df['C5']) 

참고 : C1, C2 .. C5 다른 모든 컬럼의 이름입니다

0
나는 다른 접근 방식을 제공하고 싶습니다

; UDF는 항상 옵션이지만, 다소 비효율적이며 성가신 IMO입니다. whenotherwise 패러다임은이 문제를 해결할 수 있습니다.

df_data = df_data.join(df_iso, F.col('data') == F.col('iso'), 
         'left_outer') 
: 우리가 참여하여 ISO 조회를 할 그런

df_data = spark.createDataFrame(
    map(lambda x: (x,), 
    ['fra', 'esp', 'eng', 'usa', 'bol']), ['data']) 

:

df_iso = spark.createDataFrame([('bol', 'Bolivia'), 
           ('hti', 'Cape-Verde'), 
           ('fra', 'France')], ['iso', 'country']) 

는 그런 다음 데이터를 고려 할 수 있습니다 : - 첫째, 효율성에 대한 DataFrame하여 사전을 나타냅니다

마지막으로 일치 항목에 따라 원하는 열 (나는 result)을 추가합니다.

df_data = df_data.select(
    F.col('data'), 
    F.when(F.col('iso').isNull(), F.col('data')) 
    .otherwise(F.col('country')).alias('result')) 

결과는 다음과 같다 :

+----+-------+ 
|data| res| 
+----+-------+ 
| esp| esp| 
| bol|Bolivia| 
| eng| eng| 
| fra| France| 
| usa| usa| 
+----+-------+ 
관련 문제