2016-09-06 5 views
1

私は非常に簡単なことをしたいと思いますが、Python/Spark(1.5)/ Dataframe(それはすべて私にとって新しいものです) 。Python Spark Dataframes:別の列の条件に基づいて列を更新する方法

元のデータセット:

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

新しいデータセット:(?擬似Pythonで)

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は次のようになります。

def mapCountry(iso,country): 
    if(iso=='AFG'): 
     return 'Afghanistan' 
    return country 

が、これでエラーがあります:ValueError: Cannot convert column into bool:

+0

あなたが火花で列を更新することはできません。適切なロジックを使用して、常に1つのデータフレームを別のデータフレームに変換します。 –

+0

はい、それは私がやっていることです。別のデータフレームdf→dfgを参照してください(私はもっと意味のある名前を付けるべきです)ごめんなさい – Babu

+0

私は質問を「列を更新する方法」を参考にしていました –

答えて

1

まあ、私は解決策を見つけたが、これはそれを行うにはどのようにクリーンな方法であるかどうかを知りません。他のアイデア?

iso_to_country_dict = { 'BOL': 'ボリビア'、 'HTI': 'カーボベルデ'、 'C​​OD': 'コンゴ'、 'PRK': '韓国'、 'LAO': 'ラオス'}

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 = spark.createDataFrame(
    map(lambda x: (x,), 
    ['fra', 'esp', 'eng', 'usa', 'bol']), ['data']) 

その後、我々が参加することにより、ISOのルックアップを行います:

df_data = df_data.join(df_iso, F.col('data') == F.col('iso'), 
         'left_outer') 

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

そして、次のデータを考慮することができます

最後に、マッチに基づいて目的の列(私は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| 
+----+-------+ 
関連する問題