Перенос значений из одного кадра данных в другой - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть один фрейм данных с информацией о поездках, а другой - с информацией о местах и ​​зонах.

     Origin       Coordinates     Time
0    Victoria     x,y             15:32
1    Wembley      x,y             14:00
2    Canary Wharf x,y             11:00
3    Stratford    x,y             09:00




     Station    Zone
0    Victoria   1
1    Waterloo   1
2    Stratford  2

Я хочу взять информацию из второго фрейма данных и добавить столбец «OriginZone» в первыйфрейм данных с соответствующей зоной.

До сих пор я пробовал следующее:

def getZone(Station):
    return stations[stations.Station == Station]['Zone'].values[0]


df['OriginZone'] = getZone(df['Origin'])

ValueError: Может сравнивать только объекты Series с одинаковыми метками

Прежде всего,почему я получаю эту ошибку?И как мне обойти эту проблему?

1 Ответ

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

Я думаю, что вы ищете merge ваших фреймов данных. Если ваш первый кадр данных df_1, а второй df_2, попробуйте следующее:

df_1.merge(df_2, left_on = 'Origin', right_on='Station', how='left').drop('Station', axis=1)

Что возвращает:

         Origin Coordinates   Time  Zone
0      Victoria         x,y  15:32   1.0
1       Wembley         x,y  14:00   NaN
2  Canary Wharf         x,y  11:00   NaN
3     Stratford         x,y  09:00   2.0

Обратите внимание, что NaN есть, потому что вам не хватает данных Zone в ваших df_2 для этих станций.

Объяснение : здесь используется merge, который объединяет два ваших кадра данных, где df_1['Origin'] соответствует df_2['Station']. Я выбрал how = 'left', чтобы он не удалял строки из левого кадра данных (df_1), где отсутствуют данные, и, наконец, удалил дополнительный столбец Station, который не нужен для ваших целей.

Что касается того, почему вы получаете эту ошибку, я думаю, что есть несколько вещей, которые ваш код пытается сделать, которые не работают, но главное, что бросается в глаза, это то, что вы звоните getZone с pd.Series в качестве аргумента, поэтому он пытается сравнить ваш stations фрейм данных (который в вашем примере имеет длину 4) с вашим df['Origin'] (который имеет длину 3). Даже если длины и индексы совпадают, я не уверен, что это достигнет того, что вы хотели. Вы можете сделать это с помощью цикла и оператора .loc, но это будет неуклюже. merge существует по этим причинам!

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