У меня есть проект, в котором я пытаюсь обновить фрейм данных до нового набора изменений. В настоящее время в фрейме данных содержится 15 000 выборок данных, поэтому время выполнения может быстро стать проблемой. Я знаю, что векторизация фрейма данных с использованием numpy — это хороший способ сократить время выполнения, но у меня возникла проблема с моим массивом numpy и словарем.
Цель состоит в том, чтобы посмотреть значение в col3, использовать его в качестве ключа к df_dict и использовать значение этой словарной статьи для умножения на col2 и присвоения col1.
Я смог сделать это с помощью циклов for , но это привело к серьезной проблеме времени выполнения, особенно потому, что требуется больше шагов, чем просто то, о чем я прошу помощи.
d = {"col1": [1, 2, 3, 4], "col2": [1, 2, 3, 4], "col3": ["a","b","c","d"]}
df = pd.DataFrame(data=d)
df_dict = {"a":1.2,"b":1.5,"c":0.95,"d":1.25}
df["col1"]=df["col2"].values*df_dict[df["col3"].values]
Я ожидаю, что col1 будет обновлен до [1.2, 3, 2.85, 5], но вместо этого получаю сообщение об ошибке
TypeError: unhashable type: 'numpy.ndarray'
Я понимаю, почему возникает ошибка, я просто хочу найти лучшую альтернативу.
Поиск в словаре должен выполняться один за другим.






Похоже, вам нужно.
d = {"col1": [1, 2, 3, 4], "col2": [1, 2, 3, 4], "col3": ["a","b","c","d"]}
df = pd.DataFrame(data=d)
df_dict = {"a":1.2,"b":1.5,"c":0.95,"d":1.25}
df["col1"]=df["col2"]* [df_dict.get(i, 1) for i in df["col3"]]
print(df)
Выход:
col1 col2 col3
0 1.20 1 a
1 3.00 2 b
2 2.85 3 c
3 5.00 4 d
Спасибо за ответ! это наиболее оптимизированный для времени выполнения способ, учитывая, что он все еще выполняет базовые циклы Python?
Вы можете использовать немного лучшее решение, используя .map.
Итак, замените:
df["col1"]=df["col2"].values*df_dict[df["col3"].values]
С участием:
df["col1"]=df["col2"] * df['col3'].map(df_dict)
Похоже, это map работает, сначала конвертируя словарь в серию, pd.Series(df_dict).
df["col1"]=df["col2"]* [df_dict.get(i, 1) for i in df["col3"].values]?