4

次のようなパンダピボットテーブルがあります。

C             bar       foo
A     B                    
one   A -1.154627 -0.243234
three A -1.327977  0.243234
      B  1.327977 -0.079051
      C -0.832506  1.327977  
two   A  1.327977 -0.128534
      B  0.835120  1.327977
      C  1.327977  0.838040

上記の表が A = 1 をフィルター処理するように、列 A の列 B の行が 2 行未満の行をフィルター処理できるようにしたいと考えています。

C             bar       foo
A     B                    
three A -1.327977  0.243234
      B  1.327977 -0.079051
      C -0.832506  1.327977  
two   A  1.327977 -0.128534
      B  0.835120  1.327977
      C  1.327977  0.838040

これどうやってするの?

4

2 に答える 2

7

一行で:

In [64]: df[df.groupby(level=0).bar.transform(lambda x: len(x) >= 2).astype('bool')]
Out[64]: 
              bar       foo
two   A  0.944908  0.701687
      B -0.204075  0.713141
      C  0.730844 -0.022302
three A  1.263489 -1.382653
      B  0.124444  0.907667
      C -2.407691 -0.773040

pandas (11.1) の今後のリリースでは、新しいfilter方法により、これがより迅速かつ直感的に実現されます。

In [65]: df.groupby(level=0).filter(lambda x: len(x['bar']) >= 2)
Out[65]: 
              bar       foo
three A  1.263489 -1.382653
      B  0.124444  0.907667
      C -2.407691 -0.773040
two   A  0.944908  0.701687
      B -0.204075  0.713141
      C  0.730844 -0.022302
于 2013-06-14T14:35:39.410 に答える
2

1 つの方法は、「A」でグループ化して、サイズが 3 を超えるグループを調べることです。

In [11]: g = df1.groupby(level='A')

In [12]: g.size()
Out[12]:
A
one      1
three    3
two      3
dtype: int64

In [13]: size = g.size()

In [13]: big_size = size[size>=3]

In [14]: big_size
Out[14]:
A
three    3
two      3
dtype: int64

次に、「適切な」「A」値を持つ行を確認し、これらでスライスします。

In [15]: good_A = df1.index.get_level_values('A').isin(big_size.index)

In [16]: good_A
Out[16]: array([False,  True,  True,  True,  True,  True,  True], dtype=bool)

In [17]: df1[good_A]
Out[17]:
              bar       foo
A     B
three A -1.327977  0.243234
      B  1.327977 -0.079051
      C -0.832506  1.327977
two   A  1.327977 -0.128534
      B  0.835120  1.327977
      C  1.327977  0.838040
于 2013-06-14T13:38:21.797 に答える