2017-11-17 10 views
0

最近、あるデータフレーム列の多くのカテゴリをいくつかの上位のサブカテゴリにマップする必要がありました。私はこれを達成するためのより簡潔な方法が 以下であるかどうか疑問に思っていました。カテゴリの列の多くの値を変換するPython

df_to_map = pd.DataFrame({"cities": [ 'Thessaloniki', 'Geel', 'Bern', 'Dublin', 'Hanover' , 
'Gurabo','Buenos Aires','Manati' ,'Panama', 'Lima', 
'Washington', 'Huston', 'Kairo']}) 

Aggregate_cities={ 
'Thessaloniki':'Europe', 'Geel':'Europe', 'Bern':'Europe', 'Dublin':'Europe', 'Hanover':'Europe', 
'Gurabo':'Latin America','Manati' :'Latin America', 'Panama':'Latin America', 'Lima': 'Latin America' ,'Buenos Aires': 'Latin America', 
'Washington':'North America', 'Huston':'North America', 'Boston': 'North America' 
} 

df_to_map['continent']= df_to_map.cities.map(Aggregate_cities) 
+2

;) – jezrael

+0

が、例えばを置くことも可能であろうがすべてのヨーロッパの都市を1つのリストにまとめました。このようなものAggregate_cities = {[Thessaloniki、 'Geel'、 'Bern'、 'Dublin'、 'Hanover']: 'Europe'} –

答えて

2

これまでのところ、この問題の最も速い解決策については、@ jezraelに同意したことに同意してください。

はしかし、あなたは1つのリスト内のすべてのヨーロッパの都市を置くことが可能であろう、

コメント?

Aggregate_cities = { 
    'Europe' : ['Thessaloniki', 'Geel', 'Bern', 'Dublin', 'Hanover'], 
    'Latin Ameriac': ['Gurabo', 'Manati', 'Panama', 'Lima', 'Buenos Aires'], 
    'North America' : ['Washington', 'Huston', 'Boston'] 
    } 

は次に、この逆のにあなたのシリーズをマップ:あなたは、逆のキー/値の構造を持つ辞書を形成する場合

はい、

df_to_map['continent']= df_to_map.cities.map(
    {v: k for k, cities in Aggregate_cities.items() for v in cities}) 

は、この高速です?いいえ、あなたの現在のソリューションは辞書の理解を通じてこの逆戻りを必要としないためです。しかしおそらく、これは読みやすく、維持しやすくなります。

あなたははできませんはあなたの辞書のuse a list of cities as the keysです。

Pythonの辞書の実装は、キーオブジェクトは 「ハッシュ」機能を提供することを要求することによって、O(1)〜 辞書ルックアップの平均複雑さを低減します。

...とリストは、この要件満たしていない:私はそれが本当に良いと高速なソリューションだと思い

hash([1, 2, 3]) 
# --------------------------------------------------------------------------- 
# TypeError         Traceback (most recent call last) 
# <ipython-input-97-0b995650570c> in <module>() 
# ----> 1 hash([1, 2, 3]) 
# 
# TypeError: unhashable type: 'list' 
+1

Hmmm、あなたの答えはよかったので、削除してください;) – jezrael

関連する問題