пройдите через фрейм данных pandas, чтобы сравнить строку, если она соответствует значению строки добавления

#python #pandas

Вопрос:

Как я могу добиться следующего?

мат_но оценки
uJ/2018/001 A
uJ/2018/002 C
uJ/2018/003 B
uJ/2018/001 A
uJ/2018/003 C
uJ/2018/002 B
uJ/2018/001 D

выше приведен мой фрейм данных python pandas, и вот моя попытка:

 result = [];
for stud in df_master: ## iterate through my dataframe
    if stud == "uj/2018/001": ## if matches; append the next value in the row
        result.append(stud)
    else:
        pass
print(result)
 

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

 |:uJ/2018/001 |:A :  | :A  | :D|
 

или в списке

 uj/2018/001 ['A', 'A', 'D"]
 

Ответ №1:

используйте логическую маскировку и loc средство доступа для фильтрации результата, затем отследите позицию по groupby() cumcount() , затем pivot() и, наконец reset_index() :

 out=df.loc[df['mat_no'].eq("uJ/2018/001")]
out['key']=out.groupby('mat_no').cumcount()
out=out.pivot('mat_no','key','grades').rename_axis(columns=None).reset_index()
 

выход из out :

     mat_no          0   1   2
0   uJ/2018/001     A   A   D
 

или

Если необходимо в формате списка, затем используйте query() для фильтрации результата, затем groupby() agg() :

 out=df.query("mat_no=='uJ/2018/001'").groupby('mat_no')['grades'].agg(list).reset_index()
 

выход из out :

     mat_no          grades
0   uJ/2018/001     [A, A, D]
 

Ответ №2:

Вы можете использовать приведенную ниже команду :

  my_output = df.query("mat_no=='uJ/2018/001'").groupby('mat_no')['grades'].agg(list).reset_index()