Сопоставление списка списков с серией pandas

#python #list #map

#питон #Список #Карта

Вопрос:

Новичок в Python. Простой вопрос, от которого у меня кружится голова.

Допустим, у меня есть серия pandas следующим образом:

 my_series = pd.Series([(1,2), (2,3), (1,3)])
 

У меня также есть «поисковые» списки списков следующим образом:

 my_lookup = [([0,1], 0), ([1,1], 1), ([1,2], 2), ([2,2], 3), ([0,3], 4), ([1,3], 5), ([2,3], 6)]
 

1) Я хотел бы знать, как заменить каждую пару в my_series соответствующим значением в my_lookup. В этом случае my_series должен стать pd.Series([2, 6, 5]).

2) Я хотел бы знать, как создать новую серию с соответствующими значениями, вместо замены, как в предыдущем вопросе.

3) Меняются ли ответы, если не каждый «ключ» находится в my_lookup? Например, если my_lookup вместо этого прочитает:

 my_lookup = [([0,1], 0), ([1,1], 1), ([2,2], 3), ([0,3], 4), ([1,3], 5), ([2,3], 6)]
 

Редактировать: я думал использовать словарь и функцию map следующим образом:

 df["Gender"] = df["Sex"].map({"female":0, "male":1}).astype(int)
 

..Но мои ключи — это списки, а Python, похоже, это не нравится, поэтому я пробую другой маршрут.

Ответ №1:

Вы определенно на правильном пути, используя словарь.

Возможно ли, что ваши «ключи» изменятся? Судя по первоначальному объявлению вашей серии, похоже, что их не будет, но они есть у вас в виде списков my_lookup .

Если эти ключи не изменятся, вы можете преобразовать их в кортежи и использовать их в качестве ключей в словаре. Например (в обычном python, так как у меня нет pandas, установленных на этом компьютере для тестирования):

 d = {tuple(k): v for k,v in my_lookup}
 

Затем, чтобы заменить каждый ключ в серии, вы могли бы сделать что-то вроде:

 fReplace = lambda k: d[k]
new_series = map(fReplace, my_series) # or my_series.map if you're in pandas

# alternatively (and there's probably a nicer way, I don't have pandas to play with)
new_series = pd.Series(map(fReplace, my_series))
 

Если не каждый ключ находится в поле поиска, вам нужно решить, существует ли разумное значение по умолчанию. Если есть, вы можете использовать .get его в своем словаре:

 fReplace = lambda k: d.get(k, sensible_default_value)
 

Если нет, вы можете использовать, скажем, None по умолчанию, а затем отфильтровать результирующий ряд, чтобы удалить значения None .

Комментарии:

1. Это сделало свое дело! Большое спасибо за отличное объяснение.