Я хотел бы объединить два DataFrames
и сохранить индекс из первого кадра в качестве индекса в объединенном наборе данных. Однако, когда я выполняю слияние, полученный DataFrame имеет целочисленный индекс. Как я могу указать, что хочу сохранить индекс из левого фрейма данных?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
РЕДАКТИРОВАТЬ: переключился на пример кода, который можно легко воспроизвести
Ответы:
Примечание: для некоторых операций слияния слева вы можете получить больше строк, если есть несколько совпадений между
a
и,b
и вам потребуется выполнить дедупликацию ( документация по дедупликации ). Вот почему pandas не хранит для вас индекс.источник
a
фрейм. reset_index перемещает индекс в обычный столбец, а set_index из этого столбца после слияния также заботится о том, когда строки a дублируются / удаляются из-за операции слияния.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Вы можете сделать копию индекса на левом фрейме данных и выполнить слияние.
Я нашел этот простой метод очень полезным при работе с большими фреймами данных и использованием
pd.merge_asof()
(илиdd.merge_asof()
).Этот подход будет лучше, если сброс индекса стоит дорого (большой фрейм данных).
источник
Есть решение, отличное от pd.merge. Использование
map
иset_index
И не вводит фиктивное
index
имя для индекса.источник
pd.Dataframe
а не apd.Series
..map()
Метод определен только дляpd.Series
. Это значит, что:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
не сработает.Это позволяет сохранить индекс df1
источник
on=list_of_cols]
, это противоречит документации:If joining columns on columns, the DataFrame indexes *will be ignored*
. Имеет ли приоритет использование индексов или столбцов?Думаю, я придумал другое решение. Я присоединялся к левой таблице по значению индекса и правой таблице по значению столбца на основе индекса левой таблицы. Я сделал обычное слияние:
Затем я извлек новые номера индексов из объединенной таблицы и поместил их в новый столбец с именем Номер строки настроения:
Затем я вручную установил индекс обратно к исходному, левому индексу таблицы на основе ранее существовавшего столбца с именем Line Number (значение столбца, к которому я присоединился из индекса левой таблицы):
Затем удалили индексное имя номера строки, чтобы оно оставалось пустым:
Может быть, это немного взлом, но, похоже, работает хорошо и относительно просто. Кроме того, думаю, это снижает риск дублирования / испортить ваши данные. Надеюсь, все это имеет смысл.
источник
другой простой вариант - переименовать индекс в то, что было раньше:
merge сохраняет порядок в фрейме данных 'a', но просто сбрасывает индекс, чтобы сохранить его для использования set_axis
источник