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')