2016-05-17 134 views
0

我有一個熊貓數據幀df看起來像這樣:熊貓:集團具有/過濾煩惱

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

現在我可以GROUPBY該數據幀由項目列和值進行一些聚合:

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

如果我現在考慮這樣做分組對象,它看起來像一個堆疊數據幀:

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) 

但我得到一個:類型錯誤:「功能」對象不是可迭代

我也試過

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感謝您糾正 - 複製粘貼:) – knagaev

1

我認爲你可以使用簡單的解決方案 - 從agg前加入['Value']欄中移除Multiindex然後用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