Ошибка Data_Frame — ошибка значения: можно сравнивать только объекты серии с одинаковыми метками

#python #pandas #numpy #dataframe

#python #панды #numpy #dataframe

Вопрос:

У меня есть два data_frames, как показано ниже:

 df_name:
   Student_ID  Name        DOB
0           1  Raju 1993-02-02
1           2  Indu 1987-01-04
2           3  Laya 2000-06-24
  
 df_marks:
    Student_ID Subject  Int1/40  Int2/40
0            1     Eng       10       35
1            1     Tam       30       38
2            1     Mat       20       30
3            1     Sci       15       20
4            2     Eng       35       25
5            2     Tam       25       15
6            2     Mat       22       30
7            2     Sci       29       23
8            3     Eng       18       17
9            3     Tam       19       16
10           3     Mat       27       26
  

Задача состоит в том, чтобы создать data_frame (ниже одного), где мне нужно добавить df_marks['Int1/40'] amp; df_marks['Int2/40'] , если df_name['Student_ID'] == df_marks['Student_ID']

    Student_id  Name        DOB  Tam/50
0           1  Raju 1993-02-02     NaN
1           2  Indu 1987-01-04     NaN  
2           3  Laya 2000-06-24     NaN
  

Я пытался

 df_out['Tam/50'] = df_marks[['Int1/40','Int2/40']].sum(axis=1).where(df_marks['Subject']==df_out['Student_id'])
  

Но он выдает ошибку как,

 ValueError: Can only compare identically-labeled Series objects
  

Есть ли у нас какой-нибудь простой способ сделать это?

С уважением, Дипак Дэш

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

1. Что такое df_out ? И почему вы сравниваете df_marks['Subject']==df_out['Student_id'] ? Пожалуйста, отредактируйте свой вопрос правильно с правильным ожидаемым результатом.

2. По сути, df_out — это мой фрейм выходных данных, мне нужно добавить столбцы (‘Int1 / 40’, ‘Int2 / 40’), если Student_ID совпадает

Ответ №1:

Использовать DataFrame.join с агрегированным sum для нового столбца в df_name :

 df_marks['Tam/50'] = df_marks[['Int1/40','Int2/40']].sum(axis=1)
df_name = df_name.join(df_marks.groupby('Student_ID')['Tam/50'].sum(), on='Student_ID')
print (df_name)
   Student_ID  Name         DOB  Tam/50
0           1  Raju  1993-02-02     198
1           2  Indu  1987-01-04     204
2           3  Laya  2000-06-24     123
  

Или решение без вспомогательного столбца:

 s = (df_marks[['Int1/40','Int2/40']].sum(axis=1)
                                    .groupby(df_marks['Student_ID'])
                                    .sum()
                                    .rename('Tam/50'))

df_name = df_name.join(s, on='Student_ID')
print (df_name)
   Student_ID  Name         DOB  Tam/50
0           1  Raju  1993-02-02     198
1           2  Indu  1987-01-04     204
2           3  Laya  2000-06-24     123
  

Ответ №2:

Вы можете использовать pd.merge для сопоставления обоих фреймов данных Student_ID . Затем используйте groupby и sum :

 In [574]: res = pd.merge(df_name, df_marks,on='Student_ID')
In [592]: r = res.groupby(['Student_ID', 'Name', 'DOB'])[['Int1/40','Int2/40']].sum(1).reset_index()

In [594]: r['Tam/50'] = r['Int1/40']   r['Int2/40']
In [604]: r.drop(['Int1/40', 'Int2/40'], 1, inplace=True)

In [605]: r
Out[605]: 
   Student_ID  Name         DOB  Tam/50
0           1  Raju  1993-02-02     198
1           2  Indu  1987-01-04     204
2           3  Laya  2000-06-24     123