pd.drop работает вне функции, но не в ней

#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% правы. Объединил два условия и работает.