#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()