Объединение наборов данных на основе 3 столбцов разного размера

#python #pandas #dataframe #dataset

#питон #панды #dataframe #набор данных

Вопрос:

Я хочу объединить два набора данных, но я не знаю, как это сделать. Первый набор данных имеет следующий формат.

   Year    Team    Wins   Loses
  ----------------------------
  2020    MLK     14       4
  2020    BRKL    10       5
  2020    PHX      5      10
  2019    BRKL    11       4
  2019    MLK     10       5
  2019    PHX      8       7
  2018    ...     ...     ...
 

Второй набор данных имеет следующий формат:

   Year    Team1  Points1  Team2   Points2
  ---------------------------------------
  2020    MLK      80      PHX      66
  2020    PHX      71      BRKL     70
  2020    BRKL     90      MLK      80
  2019    PHX      69      BRKL     70
  2019    ...      ...     ...      ...
 

Конечный набор данных, который я хочу иметь, имеет следующий формат:

   Year    Team1  Points1  Team2   Points2 Team1Wins Team1Loses  Team2Wins  Team2Loses
  2020    MLK      80      PHX      66       14         4           5          10 
  2020    PHX      71      BRKL     70       5          10          10          5
  2020    BRKL     90      MLK      80       10         5           14          4
  2019    PHX      69      BRKL     70       8          7           11          4
  2019    ...      ...     ...      ...      ...        ...         ...         ...
 

Я прочитал вопросы здесь, но у меня нет решения для моей проблемы. Я пробовал что-то подобное выше, но это неправильное решение.

   import pandas as pd

  a = pd.read_csv("Score.csv",error_bad_lines=False)
  b = pd.read_csv("Team.csv",error_bad_lines=False)
  merged = pd.merge(a, b, how='left', on=['Year'])
  print(merged)
 

Есть ли способ достичь этого?

Комментарии:

1. если вы ссылаетесь на мой код, я не знаю. Вот почему я задаю этот вопрос 🙂

Ответ №1:

Использовать DataFrame.merge со rename столбцами:

 d = {'WIN%':'Team1Wins','FG%':'Team1Loses','Team':'Team1'}
df = b.merge(a.rename(columns = d)[['Team1Wins','Team1Loses','Team1','Year']], 
             on=['Year', 'Team1'])

d = {'WIN%':'Team2Wins','FG%':'Team2Loses','Team':'Team2'}
df = df.merge(a.rename(columns = d)[['Team2Wins','Team2Loses','Team2','Year']], 
              on=['Year', 'Team2'])
print (df)
   Year Team1  Points1 Team2  Points2  Team1Wins  Team1Loses  Team2Wins  
0  2020   MLK       80   PHX       66         14           4          5   
1  2020   PHX       71  BRKL       70          5          10         10   
2  2020  BRKL       90   MLK       80         10           5         14   
3  2019   PHX       69  BRKL       70          8           7         11   

   Team2Loses  
0          10  
1           5  
2           4  
3           4  
 

Комментарии:

1. Спасибо за ваше время, у меня есть ошибка трассировки (последний последний вызов) в этой строке df = b.merge(a.rename(columns = d), on=[‘Year’, ‘Team1’])

2. @The_elevator — Можете ли вы опубликовать последнюю строку ошибки?

3. Это последняя строка ошибки: File «C:Python38libsite-packagespandascoregeneric.py «, строка 1684, в _get_label_or_level_values вызывает KeyError(ключ) KeyError: ‘Team1’

4. @The_elevator — Так это значит , что нет имени столбца Team1 , что такое print (df1.columns.tolist()) и print (df2.columns.tolist()) ?

5. я запускаю следующие команды, подобные этой print (a.columns. tolist()) и это выведет у меня на экране следующее: [‘Year’, ‘Team1’, ‘Points1’, ‘Team2’, ‘Points2’]