2016-01-11 3 views
1

У меня есть большой dataframe, где каждому ключу присваивается одно значение. Однако у меня есть случаи, когда ключ имеет несколько значений, то они должны быть решены путем выбора максимального значенияPandas GroupBy aggegate только некоторые группы

пример (дата + тест является ключом):

df = pd.DataFrame({'date':['1/1/16','1/2/16','1/1/16','1/1/16'],'test':['A','A','B','B'],'Val':[3,4,1,4]}) 
grouped = df.groupby(['date','test']) 

можно сделать:

agg = grouped.apply(lambda x: x[x['Val'] == x['Val'].max()]) 

Однако df составляет ~ 400 тыс. Записей, с отображением всего ~ 300 ключей на несколько значений. Я надеялся ускорить этот процесс, отделив от остальных ключи от остальных и запустив max на очень маленький набор, а затем рекомбинировав.

Я могу получить количество:

ct = grouped.count() 

но как я использую его в качестве индекса в группе?

это не работает:

grouped[ct>1] 

спасибо

[обновление 1]

Вот что я имею в виду.

keys = ['date','test'] 
ct = pd.DataFrame() 
ct['Count'] = grouped.apply(lambda x: len(x)) 
ct.reset_index(inplace=True) 
df = pd.merge(df,ct,on=keys,how='inner') 

Теперь я могу разделить кадр данных на два на основе количества, равного 1 или больше. Все еще будет рад услышать предложение о том, как это сделать лучше.

+0

является 'grouped ['Val']. Idxmax()' что вы после? – EdChum

+0

Не совсем. Я придумал решение и обновил свой пост. Спасибо. – Arthur

ответ

0
df['Max_Val'] = df.groupby(['date','test']).transform(lambda x: x.max() if x.size > 1 else x) 

выходы:

Val date test Max_Val 
0 3 1/1/16 A  3 
1 4 1/2/16 A  4 
2 1 1/1/16 B  4 
3 4 1/1/16 B  4 

Это результат вы после?

+0

почти все. Спасибо. – Arthur

Смежные вопросы