Объединение двух DataFrames

У меня есть 2 DataFrames которые я хотел бы объединить. Я посмотрел на документацию и попытался выполнить следующую операцию, но запутался в том, как это сделать. Как я уже сказал, у меня есть 2 DataFrames:

df1:

      id        name  type currency
0  BTA.S   Applewood  Hard      GBp
1  VOD.S    Softwood  Soft      GBp

а также

df2:

   id
BTA.S    301.221525
VOD.S    213.791400

и я хотел бы вернуться:

      id        name  type currency       price
0  BTA.S   Applewood  Hard      GBp  301.221525
1  VOD.S    Softwood  Soft      GBp  213.791400

Где столбец цен из df2 объединен с df1. (Просто чтобы вы знали, что ко времени, когда я закончу, будет больше пород древесины).

Я попробовал несколько способов сделать это:

Result = df1.merge(df2[['*.S']], left_on='id', right_index=True) 

где я встретил исключение:

ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'>

а также

Result = pd.concat([Df1, Df2], axis=1, ignore_index=True)

где я получаю исключение:

ValueError: labels ['type'] not contained in axis

Но я запутался.

Ответ 1

Сообщение об ошибке указывает, что df2 имеет тип pd.Series. Вам нужно преобразовать df2 .to_frame(), так как .merge() нужен вход pd.DataFrame() (см. Документы):

df1.merge(df2[['*.S']].to_frame(), left_on='id', right_index=True)

в то время как вы, вероятно, также просто могли:

df1.merge(df2.to_frame(), left_on='id', right_index=True)

В качестве альтернативы вы можете использовать pd.DataFrame.join(), который принимает pd.Series.

Ответ 2

Эта ошибка означает, что один из ваших объектов не a pandas Кадр данных.

ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'>

Чтобы доказать это самому себе,

print(type(df2))

И это должно выводить pandas.core.series.Series

Чтобы достичь желаемого результата,

df2 = df2.to_frame().reset_index()
df2.columns = ['id', 'price']
df1.merge(df2)

Выходы:

    id  name    type    currency    price
0   BTA.S   Applewood   Hard    GBp     301.221525
1   VOD.S   Softwood    Soft    GBp     213.791400

Ответ 3

Вы можете просто добавить df2 (который является серией, а не DataFrame) в качестве нового столбца

df['price']=df2