map
может быть намного быстрее, чем replace
Если ваш словарь содержит более двух ключей, использование map
может быть намного быстрее, чем replace
. Существуют две версии этого подхода, в зависимости от того, исчерпывает ли ваш словарь все возможные значения (а также хотите ли вы заменить несоответствия или оставить их как отсутствующие значения):
В этом случае форма очень проста:
df['col1'].map(di) # note: if the dictionary does not exhaustively map all
# entries then non-matched entries are changed to NaNs
Хотя map
чаще всего принимает функцию как свой аргумент, она может альтернативно принимать словарь или серию: Документация для Pandas.series.map
Если у вас есть не исчерпывающее отображение и вы хотите сохранить существующие переменные для несоответствий, вы можете добавить fillna
:
df['col1'].map(di).fillna(df['col1'])
, как в ответе @ jpp здесь: Заменить значения в серии pandas с помощью словаря эффективно
Используя следующие данные с версией pandas 0.23.1:
di = {1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H" }
df = pd.DataFrame({ 'col1': np.random.choice( range(1,9), 100000 ) })
и тестируя с %timeit
, похоже, что map
примерно в 10 раз быстрее, чем replace
.
Обратите внимание, что ваше ускорение с map
будет отличаться в зависимости от ваших данных. Самое большое ускорение, похоже, связано с большими словарями и исчерпывающими заменами. См. Ответ @jpp (см. Выше) для более подробных тестов и обсуждения.
@ user268396 рассказал вам, почему, и я расскажу вам, как.
«Access-Control-Allow-Origin
» означает источник, которому вы разрешили сделать запрос на этот сервер.
Это может быть в таких формах, как:
"Access-Control-Allow-Methods
" должно быть [] string ("POST", "OPTION"), если вы хотите разместить данные из CORS.
Когда дело доходит до Голанга, см. Godoc https://golang.org/pkg/net/http/#Header
type Header map[string][]string
И я всегда предлагаю использовать [114 ] вместо Header.Set()
, если вы точно не знаете, что делаете. Потому что каждое значение в заголовке всегда будет [] строкой.
Так и должно быть
res.Header().Add("Access-Control-Allow-Origin", "*")
res.Header().Add("Access-Control-Allow-Methods", "POST")
res.Header().Add("Access-Control-Allow-Methods", "OPTION")
res.Header().Add("Content-Type", "application/json")
Это не так, как вы делаете CORS
на бэкэнде. Ваш бэкэнд должен прослушивать запросы типа HTTP OPTIONS
и отправлять туда заголовки CORS.
Поток управления примерно такой:
Проблема решена, во многом благодаря всем, кто помог мне понять, что я не делаю CORS должным образом. По сути, было две проблемы: 1. Я не знал, как правильно установить заголовки в бэкэнде, и 2. Я не форматировал свои данные JSON должным образом.
Я заметил, что это довольно популярная проблема переполнения стека, возможно, отчасти потому, что некоторые из нас не совсем понимают, как работают запросы. Итак, вот резюме, взятое из бесценной и просто написанной документации Mozilla и комментариев пользователя user268396. Я новичок в этом, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.
Обычно это просто: когда вы хотите что-то запросить, браузер устанавливает соответствующие заголовки на основе того, что у вас уже есть, и отправляет запрос. Сервер отвечает.
Но, предполагая, что у вас есть конечная точка API POST на вашем внутреннем сервере и внешний интерфейс в том же домене (я полагаю, это большинство из нас в разработке, хотя, возможно, не в производстве), и вы работаете с чем-то другим, кроме application / x-www-form-urlencoded, multipart / form-data и text / plain, тогда это немного по-другому. В моем случае я работаю с приложением / JSON. Итак, это выглядит так:
Браузер отправляет запрос методом OPTIONS, спрашивая, какие методы и типы контента и другие вещи разрешены. Это называется предполетным запросом. Он еще не отправил мой объект JSON.
Сервер отвечает на предварительный запрос.
Чтобы сервер отвечал разрешенными вещами, нам нужно правильно настроить серверную часть, чтобы разрешить метод OPTIONS в Access-Control-Allow-Methods, и если вы, как и я, используете Gorilla mux, запомните разрешить это и в router.HandleFunc()
.
Поскольку наши передние и внутренние части находятся в одном домене ( http: // localhost ), проще всего установить Access-Control-Allow-Origin в «*». Тем не менее, мы, вероятно, не хотим делать это на производстве в зависимости от наших потребностей, поскольку * означает, что весь мир и за его пределами могут отправлять запросы.
Поскольку я хочу получать JSON, я также установил Content-Type в бэкэнде на application / json. Это была другая половина моей проблемы. Короче говоря, независимо от того, что сработало для других людей, по какой-то причине мне все же пришлось применить JSON.stringify()
к моим необработанным данным JSON. Тогда это сработало идеально.
И это все.