转换分类列python的许多值

时间:2017-11-17 14:24:04

标签: python pandas

我最近不得不将一个数据框列中的许多类别映射到几个更高的子类别。我想知道是否有更简洁的方法来实现这一目标 下面的一个。

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)

1 个答案:

答案 0 :(得分:2)

就速度而言,与@jezrael一致认为您目前只有最快的解决方案。

但是,你评论说,

  

是否有可能将所有欧洲城市列入一个名单?

是的,如果你愿意,可以形成一个具有反向键/值结构的字典:

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的字典实现降低了平均复杂度   字典通过要求密钥对象提供a来查找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'