2016-12-05 5 views
1

У меня есть данные, что выглядит следующим образом:Как выбрать значения на основе агрегации других столбцов в группе с помощью Python Pandas?

system question answer grade rank 
sys1  q1   a1  A  5 
sys1  q1   a1  B  10 
sys2  q1   a1  C  1 
sys2  q1   a1  D  11 

Моя цель состоит в группе вопроса и ответа, принимая лучший сорт и звание, а также системы, связанной с лучшей степени. Ниже приведен пример того, что я хотел бы выполнить:

>>df.groupby(['question', 'answer']).agg({'grade': np.min, 'rank': np.min, 'system': ???).reset_index() 
question answer grade rank system 
q1   a1  A  1  sys1 

Я получаю то, что я хочу для класса и ранга, как я просто взять минимумы. Каков наилучший способ получить желаемую систему?

ответ

1

Я думаю, что вы можете использовать sort_values первый, а затем агрегат last:

print (df) 
    system question answer grade rank 
0 sys1  q1  a1  A  5 
1 sys2  q1  a1  B 10 
2 sys3  q1  a1  C  1 
3 sys4  q1  a1  D 11 

df = df.sort_values('grade') 
     .groupby(['question', 'answer']) 
     .agg({'grade': np.min, 'rank': np.min, 'system':'last'}) 
     .reset_index() 
print (df) 
    question answer system rank grade 
0  q1  a1 sys4  1  A 

Я не уверен, но, возможно, потребуется first:

df = df.sort_values('grade') 
     .groupby(['question', 'answer']) 
     .agg({'grade': np.min, 'rank': np.min, 'system':'first'}) 
     .reset_index() 
print (df) 
    question answer system rank grade 
0  q1  a1 sys1  1  A 
+0

Самый высокий 'grade' является' D' ? – jezrael

+0

Это сработало. Благодаря! – Vince

+0

Я имел в виду «высший класс», как в лучшем классе. «Лучший сорт» - это минимальное значение, поэтому я использовал np.min для агрегации. – Vince