#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