2015-09-28 103 views
2

我有一個熊貓數據框類似如下:過濾大熊貓數據幀到多指標組

df = pandas.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', \ 
           'bar', 'bar', 'baz', 'baz', 'baz', 'baz'],\ 
         'B' : ['one', 'one', 'two', 'two', 'one', 'one', \ 
           'two', 'two', 'one', 'one', 'two', 'two'],\ 
         'C' : pandas.np.random.randn(12)}) 

df 

    A B   C 
0 foo one -0.241101 
1 foo one -0.658436 
2 foo two 0.300752 
3 foo two -0.589445 
4 bar one 1.775511 
5 bar one 0.068603 
6 bar two -0.464550 
7 bar two -0.621055 
8 baz one -1.469311 
9 baz one 0.490963 
10 baz two -0.606491 
11 baz two -0.006323 

我想要做的是過濾用C這比該組的平均值的那些值( A,B)。

分組工作:

groups = df.groupby([df.A, df.B]) 
upper_bound = groups.C.mean() 
upper_bound 

A B 
bar one 0.922057 
    two -0.542803 
baz one -0.489174 
    two -0.306407 
foo one -0.449768 
    two -0.144346 
Name: C, dtype: float64 

但我怎麼現在篩選,這樣(在這個例子中)排1 foo one -0.658436將被刪除

我嘗試了以下幾件事:

df_ = df.loc[df.C <= upper_bound.loc[df.A, df.B]] 

但那說

'None of [0  foo\n1  foo\n2  foo\n3  foo\n4  bar\n5  bar\n6  bar\n7  bar\n8  baz\n9  baz\n10 baz\n11 baz\nName: A, dtype: object] are in the [index]' 

而且我想:

df_ = df.loc[df.C <= upper_bound[df.A, df.B]] 

這給了我:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)() 
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3492)() 
TypeError: 

我這樣嘗試它的原因是因爲我已經(至少我認爲)設法做到了「相同「的事情,但有一個層次的羣體:

groups = df.groupby([df.A]) 
upper_bound = groups.C.mean() 
df_ = df.loc[df.C <= upper_bound.loc[df.A] 

而實際得到的DF擺脫everyhing的,其中C是低於UPPER_BOUND。

我做錯了什麼想法?

回答

3

您將groupby的結果upper_bounddf['C']進行了比較,但它們具有不同數量的元素。使用transform來確定每組中存在的每條線的平均值,並將其與df['C']進行比較。應用此面膜loc

import numpy as np 

df.loc[df['C']>=df.groupby(['A','B']).transform(np.mean)['C'],] 

Out[13]: 
     A B   C 
0 foo one 0.579987 
3 foo two 1.701136 
5 bar one 1.955158 
7 bar two 0.943862 
9 baz one -0.628506 
10 baz two 1.097203 
+0

非常感謝!這實際上到目前爲止工作! :) 但我仍然不明白我做錯了什麼。你能否詳細說明不同數量的元素參數?我認爲通過選擇'upper_bound.loc [df.A,df.B]''我會得到正確的數量,就像在一級組操作中一樣...... – degill