У меня есть два фрейма данных
df
x
0 1
1 1
2 1
3 1
4 1
df1
y
1 1
3 1
И я хочу объединить их в индексе, но при этом сохранить индексы, которых нет в df1
. Это мой желаемый результат
x y
0 1 0
1 1 1
2 1 0
3 1 1
4 1 0
Я пробовал слияние по индексу, вот так
pd.merge(df, df1s, left_index=True, right_index=True)
Но это избавляет от значений индекса не в df1
. Например:
x y
1 1 1
3 1 1
Это не то, чего я хочу. Я пробовал и outer
, и inner
присоединиться, но безрезультатно. Я также пытался прочитать другие вопросы о слиянии панд, но, похоже, не могу понять здесь мой конкретный случай. Извиняюсь, если вопросы о слиянии избыточны, но опять же, я не могу понять, как слить так, как мне хотелось бы в этом конкретном сценарии. Спасибо!
В вашем коде отсутствует параметр how
: pd.merge(df, df1, left_index=True, right_index=True, how = "left").fillna(0)
Попробуйте объединить строки и заполнить NaN 0
pd.concat([df,df1], axis=1).fillna(0)
x y
0 1 0.0
1 1 1.0
2 1 0.0
3 1 1.0
4 1 0.0
Нет необходимости в каком-либо сложном слиянии, вы можете просто скопировать столбец напрямую, заполнить NaN и установить dtype. Вы можете сделать это напрямую или с помощью pd.concat()
:
pd.concat([df1, df2], axis=1).fillna(0).astype(int)
x y
0 1 0
1 1 1
2 1 0
3 1 1
4 1 0
Чем это отличается от другого ответа, кроме того факта, что вы добавили astype(int)
? Если кто-то уже опубликовал решение, лучше не публиковать точно такое же решение.
Когда я начал заполнять свой ответ, комментариев не было, поэтому я не заметил, что кто-то еще придумал подобное решение. При этом это по-прежнему единственное решение, которое дает желаемый результат, заданный в исходном вопросе.
Я бы порекомендовал
join
при выполненииleft merge
наindex
: вы можетеjoin
и заполнить нас нулем:df.join(df1).fillna(0)