#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.