Перебор массива numpy для использования в словаре - PullRequest
1 голос
/ 02 июля 2019

У меня есть проект, в котором я пытаюсь обновить информационный фрейм, чтобы внедрить новый набор изменений. В настоящее время в фрейме данных содержится 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'

Я понимаю, почему возникает ошибка, я просто хочу найти лучшую альтернативу.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Похоже, вам нужно.

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
0 голосов
/ 02 июля 2019

Вы можете использовать немного лучшее решение, используя .map.

. Замените:

df["col1"]=df["col2"].values*df_dict[df["col3"].values]

на:

df["col1"]=df["col2"] * df['col3'].map(df_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...