pandas left join возвращает большую матрицу и не работает

#python #pandas

#python #pandas

Вопрос:

У меня есть 2 фрейма данных, 1-й находится ниже «station_anal»

         count   Start station number
index       
31623   17105   31623
31258   11432   31258
31201   10194   31201
31200   9505    31200
31247   9145    31247
  

2-й фрейм данных «vt» равен:

     Start station number    Start station
0   31214                   17th amp; Corcoran St NW
1   31104                   Adams Mill amp; Columbia Rd NW
2   31221                   18th amp; M St NW
3   31111                   10th amp; U St NW
4   31260                    23rd amp; E St NW
  

station_anal имеет размер 486×2

размер vt равен 8000×2

моя команда left join:

 lj = pd.merge(station_anal, vt, how = 'left', on = 'Start station number')
  

dtypes одинаковы для обоих столбцов, а именно int64

однако lj возвращает:

 lj.head()

count   Start station number    Start station
0   17105   31623   Columbus Circle / Union Station
1   17105   31623   Columbus Circle / Union Station
2   17105   31623   Columbus Circle / Union Station
3   17105   31623   Columbus Circle / Union Station
4   17105   31623   Columbus Circle / Union Station
  

размером 8000×3

Не имеет смысла, поскольку, насколько я понимаю, left join результирующий размер строки матрицы всегда является первым фреймом данных в данном случае 486

Комментарии:

1. не могли бы вы включить данные, которые другие могут загрузить в ваш пост, вставив выходные df.to_json() данные в ваш пост, например.

2. Я бы хотел, но данные конфиденциальны, приведенная выше глава () должна предоставить достаточную информацию, а также размеры матриц обоих фреймов данных, чтобы выяснить проблему. Спасибо

3. затем вы должны соответствующим образом ее запутать — вы также должны знать, что график конфиденциальной информации также является конфиденциальным

4. Содержит ли фрейм данных «vt» 8000 строк с уникальными «номерами начальной станции»?

5. в первом df station_anal нет повторений vt, уникальные номера начальных станций существуют в первом df station_anal, таким образом, в station_anal есть 486 уникальных станций, а результирующий фрейм данных left join в station_anal также должен иметь 486 строк, насколько я понимаю

Ответ №1:

Давайте используем map:

station_anal[‘Начальная станция’] = station_anal[‘Начальный номер станции’]
.map(vt.set_index(‘Начальный номер станции’)[‘Начальная станция’])

Обновление удаляет дубликаты, затем сопоставляет:

 mapper = vt.drop_duplicates('Start Station Number')
           .set_index('Start station number')['Start station']

station_anal['Start Station'] = station_anal['Start station number']
                                     .map(mapper)
  

Комментарии:

1. не работает в df, поскольку номер начальной станции не уникален, и python выдает ошибку «Переиндексация допустима только для объектов с уникальным значением индекса»

2. Ах .. итак, vt имеет дубликат «номер начальной станции».

3. о, почему 2-я таблица в левом соединении дублируется, так как я думал, что левое соединение — это простой поиск для первой таблицы. В любом случае, спасибо, я сделал то, что вы сделали немного по-другому: 1. vt.drop_duplicates() 2. pd.merge(station_anal, vt, on=’Start station #’, how = ‘left), и это сработало, учитывая правильный размер 486.