Python: поиск по двум фреймам данных и когда совпадения данных добавляются в новый фрейм данных - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть два фрейма данных, и я хочу добавить значения столбцов «lat» и «lon», когда столбец «CommonName» первого фрейма данных соответствует столбцу «Name» второго фрейма данных во второй фрейм данных.

Первый кадр данных - «AllBusStops» и принимает форму:

AllBusStops = {'CommonName': ['Cambuslang Road', 'Hillsborough Road'],'lon': [-4.17351, -4.12914], 'lat': [55.82932, 55.85388]}

Второй фрейм данных SixtyOne принимает форму:

SixtyOne = {'Name': ['Canonbie Street', 'Hillsborough Road']}

Таким образом, в приведенном выше примере значения 'lat', 'lon' из фрейма данных AllBusStops будут добавлены к фрейму данных SixtyOne для Hillsborough Road.

Код выглядит так:

for i in range(len(AllBusStops)):
   for j in range(len(SixtyOne)):
        if AllBusStops[['CommonName']][i] == SixtyOne[['Name']][j]:
           Lat = AllBusStops[['Lat']][i]
           Lon = AllBusStops[['Lon']][i]

Когда я выполняю это, я получаю следующее сообщение:

KeyError: 0

During handling of the above exception, another exception occurred

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Скажите, что ваш DataFrame выглядит следующим образом:

d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

>>> df
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0
>>> 

Когда вы получаете доступ к таким столбцам (AllBusStops[['CommonName']]), он создает DataFrame (вы, вероятно, хотели серию)

>>> z = df[['one']]
>>> type(z)
<class 'pandas.core.frame.DataFrame'>
>>> z
   one
a  1.0
b  2.0
c  3.0
d  NaN
>>> 

Затем вы пытаетесь получить первый элемент с целочисленным индексом (AllBusStops[['CommonName']][i]), который создает KeyError - DataFrame ожидает метку.

>>> z[0]
Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\pandas\core\indexes\base.py", line 2442, in get_loc
...
KeyError: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#288>", line 1, in <module>
    z[0]
...
KeyError: 0

Вы можете получить Серию, используя такой столбец

>>> q = df['one']
>>> type(q)
<class 'pandas.core.series.Series'>
>>> q
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64
>>>

Затем получить первый элемент в серии

>>> q[0]
1.0
>>>

Обратите внимание, что я сделал простой DataFrame и попытался имитировать шагов вашей программы, чтобы посмотреть, смогу ли я воспроизвести проблему. Это минимальный, полный и проверяемый пример (mcve) - вы должны это прочитать. Иногда создание mcve для себя (или для публикации здесь) освещает проблему для вас или облегчает понимание себя.
Как отлаживать небольшие программы


Как говорится в ответе @ NichloasM, вы можете изучить возможность объединения / объединения данных. У Pandas отличная документация - Объединение, объединение и объединение

0 голосов
/ 28 апреля 2018

Мне не совсем понятна структура ваших данных, но звучит так, как будто вы хотите объединить данных в два кадра данных. См. Функцию DataFrame.merge.

Этот код вернет фрейм данных, такой как SixtyOne, со вставленными столбцами 'Lat' и 'Lon'.

# The value of the 'how' parameter depends on your needs; 
# see documentation for 'merge'

combined = SixtyOne.merge(AllBusStops[['CommonName', 'Lat', 'Lon']],
                          left_on='Name',
                          right_on'CommonName',
                          how='left') 

Как отмечено в комментарии, вы должны прочитать о параметре how, который принимает merge; если вы не уверены, вы можете искать в Интернете фразы вроде «SQL left external join».

Приведенный выше код использует левое соединение , которое немного отличается от вашего фрагмента кода. Но я подозреваю, что вы действительно хотите левое соединение в этом случае, например так что вы можете наблюдать записи в SixtyOne, которые не имеют значения широты и долготы после слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...