2015-02-16 4 views
0

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

df = pandas.DataFrame({'A': [10, 10, 20, 20, 30, 20, 10, 20, 30, 30], 
       'B': [1001, 1002, 2002, 2003, 3001, 2003, 1002, 2003, 3005, 3005], 
       'C': numpy.random.randn(10), 
       'D': numpy.random.randn(10)}) 

При этом применяются:

df.groupby('A').agg({'B': max, 'C': numpy.count_nonzero}) 

я получаю:

C  B 
A   
10 3 1002 
20 4 2003 
30 3 3005 

Но я хочу только подсчет C, когда она является частью максимального значения B (сгруппированных по A). Я узнал в предыдущем посте, что группировка не может быть сделана, как это - до сих пор нет счетчика C:

df.groupby('A')['B'].max() 

Это дает мне максимум B для каждого А.

A 
10 1002 
20 2003 
30 3005 
Name: B, dtype: int64 

Я с отсутствующим последний шаг, чтобы получить этот результат:

A B  C 
10 1002 2 # 2, because there are 2 rows of B = 1002 with A = 10 
20 2003 3 
30 3005 2 

в моем проекте я не знаю значения B заранее, поэтому я не могу настроить фильтр заранее.

ответ

2

Вот один из способов:

>>> df.groupby('A').apply(lambda g: pandas.Series({"MaxB": g.B.max(), "NumMax": (g.B==g.B.max()).sum()})) 
    MaxB NumMax 
A    
10 1002  2 
20 2003  3 
30 3005  2 

Операция (g.B==g.B.max()).sum() подсчитывает количество строк в группе, чьи В столбце равна максимальной величине B.

Этот способ делает это вычисляет групповой максимум два раза в группе, но вычисление max - довольно быстрая операция, поэтому это не будет приводить к значительному влиянию производительности на практике.

+0

Спасибо. Я никогда бы не нашел это решение – Michael

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