Объединить другой фрейм данных, который уже сгруппирован по столбцу

#python #pandas #dataframe #pandas-groupby

#python #панды #фрейм данных #pandas-groupby

Вопрос:

Первый фрейм данных:

 Subject     Branch     Test1        Test2       Test3
DS           IT          45          43           44
             CE          40          45           39
JAVA         MCA         43          34           39
             IT          38          43           44
             CE          34          43           37
Python       MCA         35          49           43
 

Второй фрейм данных:

 Subject     Final_Marks    Faculty
DS            45           Dr. Kumar
              40           Dr. Mamtha
JAVA          43           Prof. Sagar
              38           Dr. Chethana
              34           Prof. Smitha
              43           Dr. Romin
Python        35           Dr. Rakesh
              46           Prof.Chethan
 

Я хочу объединить эти два фрейма данных в «теме».

Ожидаемый результат:

 Subject     Branch     Test1        Test2       Test3    Final_Marks      Faculty
DS           IT          45          43           44        45             Dr.Kumar
             CE          40          45           39        40             Dr.Mamtha
JAVA         MCA         43          34           39        43             Prof.Sagar
             IT          38          43           44        38             Dr.Chethana
             CE          34          43           37        34             Prof.Smitha
                                                            43             Dr.Romin
Python       MCA         35          49           43        35             Dr.Rakesh
                                                            46             Prof.Chethan
 

Я пробовал:

 f = pd.merge(df1,df2,on='Subject', how='left')
 

Но второй фрейм данных повторяется для каждой строки 1-го фрейма данных. Он не дает ожидаемого результата.

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

1. Во втором фрейме данных нет информации о Branch ?

2. У вас недостаточно данных для слияния.

3. @jezrael 1-й фрейм данных сгруппирован по теме и ветке, а во 2-м фрейме данных нет информации о ветке

4. Или вы уверены, что первое, второе, третье значения из Subject одинаковы для обоих фреймов данных? Никогда некоторые строки не изменяются?

Ответ №1:

Если вы уверены, что первые, вторые, третьи … строки по Subject одинаковы для обоих фреймов данных, можно использовать GroupBy.cumcount для счетчика и использовать его для слияния:

 df1['g'] = df1.groupby('Subject').cumcount()
df2['g'] = df2.groupby('Subject').cumcount() 

f = pd.merge(df1,df2,on=['Subject', 'g'], how='left')
 

При необходимости все значения нуждаются во внешнем соединении:

 f = pd.merge(df1,df2,on=['Subject', 'g'], how='outer')
 

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

1. В моем случае у меня переменное количество строк для каждой группы «subject». В этом случае cumcount() не будет работать. тогда каким должен быть подход к объединению обоих фреймов данных.

2. @codewarrior — да, если невозможно использовать вспомогательный столбец g , тогда действительно непросто получить ответ, потому что при использовании merge Subject столбцами только дублируется вывод, потому что в обоих есть дубликаты. Здесь лучше всего, если возможно, объединить по нескольким столбцам