2016-05-17 2 views
0

У меня есть панд dataframe df который выглядит следующим образом:Панды: Группа Имея/Filtering Аварии

| Index | Item  | Value  | 
+---------+------------+-------------+ 
| 0  | 1024  | 20   | 
| 1  | 1024  | 27   | 
| 2  | 1024  | 19   | 
| 3  | 4096  | 44   | 
| ...  | ...  | ...   | 

Теперь я могу GroupBy этот dataframe на колонке Item и выполнять некоторые агрегированные на значение:

grouped = df.groupby(df['Item']).agg({'Value':['median', 'mean', 'std', 'count']}) 

Если теперь я смотрю в этот сгруппированном объект, он выглядит как сложенное dataframe:

grouped.head() 

|  | Value      | 
+--------+-----------------------------+ 
|  | median | mean | std | count | 
+--------+--------+------+-----+-------+ 
| Item |  |  |  |  | 
+--------+--------+------+-----+-------+ 
| 1024 | 20 | 22.0 | 4.3 | 3  | 
| 4096 | 44 | 44.0 | NaN | 1  | 
+--------+--------+------+-----+-------+ 

теперь я хотел бы только фильтровать сгруппированные элементы, которые, например, имеют счетчик> 1, поэтому я попытался следующее:

filtered = grouped.filter(lambda x: x['count'] > 1) 

Но я получаю: TypeError: «функция» объект не итерацию

Я также попытался

filtered = grouped.filter(lambda x: x.Value.count > 1) 

или

filtered = grouped[grouped.Age.count > 1] 

но последний только бросить s KeyError: True

Как я могу добиться этой фильтрации в этом случае, в SQL это будет похоже на создание предложения GROUP BY/HAVING, когда я хочу фильтровать агрегированную сгруппированную таблицу в pandas?

Как я могу написать, например, запрос, который возвращает только строки, где медиана == означает?

спасибо.

ответ

1

Я нашел решение:

grouped[grouped.Value['count'] > 1] 

сделает это. Очевидно, что счет имени имеет два значения для этого объекта, поэтому лучше обратиться к нему с помощью синтаксиса выше.

1

панд путь для вашего вопроса о «Медиана == значит» является

df.groupby(df['Item']).filter(lambda x: x['Value'].median() == x['Value'].mean()) 

# One call to median(), one to mean() 
+0

спасибо за ваш ответ. – Regenschein

+0

@Regenschein благодарит вас за исправление - copy-paste :) – knagaev

1

Я думаю, что вы можете использовать более простое решение - удалить Multiindex из колонн добавляющих ['Value'] перед тем agg, а затем использовать boolean indexing:

g1 = (df.groupby(df['Item'])['Value'].agg(['median', 'mean', 'std', 'count'])) 
print (g1) 

     median mean  std count 
Item        
1024  20 22 4.358899  3 
4096  44 44  NaN  1 

filtered = g1[g1['count'] > 1] 
print (filtered) 
     median mean  std count 
Item        
1024  20 22 4.358899  3 
+0

это полезно, спасибо – Regenschein

+0

Если мой или другой ответ был полезен, не забудьте [принять] (http://meta.stackexchange.com/a/5235/295067). Благодарю. – jezrael

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