#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. Это сделало свое дело! Большое спасибо за отличное объяснение.