#pandas #jupyter-notebook #keyerror
#pandas #jupyter-ноутбук #ошибка ключа
Вопрос:
Работаю над созданием фрейма данных из сопоставления двух отдельных фреймов. Все работает гладко, само по себе и в Jupyter, где я проверяю это независимо.
Я только что добавил еще одно условие для удаления строки из моего фрейма данных — если это дубликат «current_edge[‘street_name’] . Эта строка работает в Jupyter notebook, когда я тестирую, но не когда я помещаю ее в функцию.
# current_edge is a dictionary of values, edge_az is a float
# edge is my dataframe
for row in edge.index:
if abs(current_edge['edgeAzimuth_deg'] - edge_az) <= turn_angle:
edge = edge.drop(row)
# drop same street names
if edge['street_name'][row] == current_edge['street_name']:
edge = edge.drop(row)
Я бы ожидал, что он удалит одну строку из моего текущего фрейма данных, но вместо этого я получаю KeyError = 0 в строке условия кода — «если edge [‘street_name’] ….»
Честно говоря, это выше моего понимания 🙂 Есть идеи, почему это будет работать вне функции, но не после ее вызова?
Комментарии:
1. Не видя вашей функции, я не могу решить проблему с разной производительностью, но попробуйте заменить последний оператор if на
if edge.loc[row, 'street_name'] == ...
, чтобы устранить ошибку ключа.2. То, что вы делаете, — это антипаттерн в pandas, кстати, обычный способ сделать это
for index, row in edge.iterrows():
, тогда вы получаетеrow
в виде серии, и ваш оператор if будет простымif row['street_name'] == ...
3. Если вы хотите удалить все повторяющиеся street_names, может быть, подумайте об использовании
df.drop_duplicates(subset = 'street_name')
в конечном df? Просто альтернативный способ мышления. Я бы, вероятно, просто отфильтровал первое условие из окончательного df вместо вашего подхода.4. Можете ли вы предоставить минимальный рабочий пример с данными? Я чувствую, что это можно упростить и векторизовать (таким образом, работать намного быстрее)
Ответ №1:
Я подозреваю, что при row = 0 это условие выполняется
if abs(current_edge['edgeAzimuth_deg'] - edge_az) <= turn_angle:
edge = edge.drop(row)
итак, строка с индексом # 0 была удалена. 2-е if
условие пыталось получить доступ к индексу # 0, поэтому оно выдает ошибку ключа
if edge['street_name'][row] == current_edge['street_name']:
edge = edge.drop(row)
Вставьте print(edge.index)
между этими 2 if
, чтобы увидеть, существует ли индекс # 0 после 1-го if
Комментарии:
1. Вы на 100% правы. Объединил два условия и работает.