Понимание списка Python с циклом над фреймом данных

1

Я ищу что-то совершенно конкретное, что я не могу найти ответ.

У меня есть два кадра данных. Тот, который содержит идентификатор, широту и долготу. У другого есть только идентификатор.

Я хочу сохранить в списке широту и долготу, пока идентификатор из Dataframe A существует в Dataframe B, используя понимание списка. Я могу заставить первую часть работать нормально, но совпадение идентификаторов, похоже, вызывает проблему. Это то, что у меня есть до сих пор:

heat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() if row['NBN Location Id'] in closed['SP Order Location ID']]

Для меня это говорит о том, что хранилище "широта" и "долгота" извлекается до тех пор, пока идентификатор существует в другом фрейме данных (закрыт). Однако это не приводит к извлечению данных. Может ли кто-нибудь вести меня о том, где я ошибаюсь? Если я исключаю последнее выражение "if", он отлично работает. Так как же еще я должен делать это, если выражение?

Спасибо!

Теги:
pandas
dataframe
list-comprehension

2 ответа

2
Лучший ответ

Я думаю, что понимание списков не является необходимым, лучше и быстрее использовать векторизованное решение по фильтру путем boolean indexing с помощью isin а затем конвертировать в списки:

mask = extract['NBN Location Id'].isin(closed['SP Order Location ID'])
cheat_data = extract.loc[mask, ['latitude', 'longitude']].values.tolist()

Образец:

closed = pd.DataFrame({'SP Order Location ID':list('ace')})
print (closed)
  SP Order Location ID
0                    a
1                    c
2                    e

extract = pd.DataFrame({'NBN Location Id':list('abcde'),
                       'latitude':['lat1','lat2','lat3','lat4','lat4'],
                       'longitude':['long1','long2','long3','long4','long4']})

print (extract)
  NBN Location Id latitude longitude
0               a     lat1     long1
1               b     lat2     long2
2               c     lat3     long3
3               d     lat4     long4
4               e     lat4     long4

mask = extract['NBN Location Id'].isin(closed['SP Order Location ID'])
cheat_data = extract.loc[mask, ['latitude', 'longitude']].values.tolist()
print (cheat_data)
[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

Ваше решение не удалось, потому что в pandas проверьте значения индекса, а не значения Series, поэтому вам нужно преобразовать в список:

cheat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() 
              if row['NBN Location Id'] in closed['SP Order Location ID'].tolist()]
print (cheat_data)
[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

#changed index values
closed = pd.DataFrame({'SP Order Location ID':list('ace')}, index=list('dbw'))
print (closed)
  SP Order Location ID
d                    a
b                    c
w                    e

cheat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() 
              if row['NBN Location Id'] in closed['SP Order Location ID']]
print (cheat_data)

[['lat2', 'long2'], ['lat4', 'long4']]
  • 2
    Отлично! Объяснил ответ и показал, почему мой был неверным.
1

Использование данных @jezrael

ids = {*closed['SP Order Location ID']}
cols = ['latitude', 'longitude', 'NBN Location Id']
[p for *p, i in zip(*map(extract.get, cols)) if i in ids]

[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

closed = pd.DataFrame({'SP Order Location ID':list('ace')})

extract = pd.DataFrame({'NBN Location Id':list('abcde'),
                       'latitude':['lat1','lat2','lat3','lat4','lat4'],
                       'longitude':['long1','long2','long3','long4','long4']})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню