Pandas объединить два фрейма данных с разными столбцами

Я, конечно, пропустил здесь что-то простое. Попытка объединить два фрейма данных в pandas, которые имеют в основном те же имена столбцов, но правильный фреймворк данных имеет некоторые столбцы, которые не имеют левого, и наоборот.

>df_may

  id  quantity  attr_1  attr_2
0  1        20       0       1
1  2        23       1       1
2  3        19       1       1
3  4        19       0       0

>df_jun

  id  quantity  attr_1  attr_3
0  5         8       1       0
1  6        13       0       1
2  7        20       1       1
3  8        25       1       1

Я попытался присоединиться к внешнему соединению:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")

Но это дает:

Left data columns not unique: Index([....

Я также указал один столбец для соединения (on = "id", например,), но это дублирует все столбцы, кроме "id", например attr_1_x, attr_1_y, что не является идеальным. Я также передал весь список столбцов (их много) до "on":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))

Что дает:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

Что мне не хватает? Я хотел бы получить df со всеми добавленными строками и attr_1, attr_2, attr_3, где это возможно, NaN, где они не отображаются. Это похоже на довольно типичный рабочий процесс для обработки данных, но я застрял.

Спасибо заранее.

Ответ 1

Я думаю, что в этом случае concat - это то, что вы хотите:

In [12]:

pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
   attr_1  attr_2  attr_3  id  quantity
0       0       1     NaN   1        20
1       1       1     NaN   2        23
2       1       1     NaN   3        19
3       0       0     NaN   4        19
4       1     NaN       0   5         8
5       0     NaN       1   6        13
6       1     NaN       1   7        20
7       1     NaN       1   8        25

передав axis=0 здесь, вы складываете df друг над другом, который, как я считаю, является тем, что вам нужно, а затем создает значение NaN, где они отсутствуют в их соответствующих dfs.

Ответ 2

У меня была эта проблема сегодня, используя любой из concat, append или merge, и я обошел ее, добавив вспомогательный столбец, последовательно пронумерованный, а затем выполнив внешнее соединение

helper=1
for i in df1.index:
    df1.loc[i,'helper']=helper
    helper=helper+1
for i in df2.index:
    df2.loc[i,'helper']=helper
    helper=helper+1
df1.merge(df2,on='helper',how='outer')