Как объединить два кадра данных с внутренним соединением, не имея повторяющихся столбцов?

#python #pandas #merge #inner-join

Вопрос:

У меня есть фрейм данных, такой как :

 ItemName Category
item1    cat1
item2    cat1
item3    cat1
item4    cat1
item5    cat2
item6    cat2
 

и такой, как:

 CategoryName Element
cat1         element1
cat2         element2
 

Я хочу объединить оба кадра данных в один на основе столбца категории, но теперь у меня есть два столбца с категориями.
Это был бы идеальный результат:

 ItemName Category Element
item1    cat1     element1
item2    cat1     element1
item3    cat1     element1
item4    cat1     element1
item5    cat2     element2
item6    cat2     element2
 

Но у меня есть результат с дубликатом категории столбца и имени категории. Как решить эту проблему с дублированием при объединении кадров данных? Что я сделал для слияния:

 result_df= df1.merge(
    df2,
    left_on='Category',
    right_on='CategoryName',
    how='inner')
 

Ответ №1:

К сожалению, вам придется переименовать столбцы:

 >>> df1.merge(df2.rename({'CategoryName': 'Category'}, axis=1), on='Category')
  ItemName Category   Element
0    item1     cat1  element1
1    item2     cat1  element1
2    item3     cat1  element1
3    item4     cat1  element1
4    item5     cat2  element2
5    item6     cat2  element2
>>> 
 

Или тебе придется это бросить:

 >>> df1.merge(df2, left_on='Category', right_on='CategoryName').drop('CategoryName', axis=1)
  ItemName Category   Element
0    item1     cat1  element1
1    item2     cat1  element1
2    item3     cat1  element1
3    item4     cat1  element1
4    item5     cat2  element2
5    item6     cat2  element2
>>> 
 

Ответ №2:

Вы можете использовать pd.Series.map :

 df["Element"] = df["Category"].map(df2.set_index("CategoryName")["Element"])

print (df)

  ItemName Category   Element
0    item1     cat1  element1
1    item2     cat1  element1
2    item3     cat1  element1
3    item4     cat1  element1
4    item5     cat2  element2
5    item6     cat2  element2