Python 仅由计数器大于X的行分组的数据帧

Python 仅由计数器大于X的行分组的数据帧,python,pandas,Python,Pandas,我想在一列中显示我拥有的组的数量,然后只显示那些拥有超过特定数量的组 考虑这个例子: import pandas as pd df = pd.DataFrame( { 'ColA': 'A A A B B C C C C D E E F F F F F F F G G H'.split(), 'ColB': '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2'.split() } ) 如果我这样分组: pr

我想在一列中显示我拥有的组的数量,然后只显示那些拥有超过特定数量的组

考虑这个例子:

import pandas as pd

df = pd.DataFrame(
    {
        'ColA': 'A A A B B C C C C D E E F F F F F F F G G H'.split(),
        'ColB': '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2'.split()
    }
)
如果我这样分组:

print df.groupby(['ColA']).agg(['count'])
我得到如下输出:

      ColB
     count
ColA      
A        3
B        2
C        4
D        1
E        2
F        7
G        2
H        1
现在,如果我只想在计数超过2时显示上面的行,我该怎么做?我希望输出没有
B
D
E
G
H

我尝试了以下两行,但都返回了相同的错误:

print df.loc[df.groupby(['ColA']).agg(['count']) > 2]
print df.loc[df.groupby(['ColA']).agg(['count'])['ColB'] > 2]
错误如下:

Traceback (most recent call last):
  File "C:/scratches/scratch_3", line 11, in <module>
    print df.loc[df.groupby(['ColA']).agg(['count'])['ColB'] > 2]
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1189, in __getitem__
    return self._getitem_axis(key, axis=0)
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1321, in _getitem_axis
    raise ValueError('Cannot index with multidimensional key')
ValueError: Cannot index with multidimensional key

回溯(最近一次呼叫最后一次):
文件“C:/scratch/scratch_3”,第10行,在
打印df_计数[df_计数.值>2]
文件“C:\Anaconda\lib\site packages\pandas\core\frame.py”,第1791行,在\uuu getitem中__
返回self.\u getitem\u数组(键)
文件“C:\Anaconda\lib\site packages\pandas\core\frame.py”,第1833行,在\u getitem\u数组中
返回self.take(索引器,轴=0,转换=False)
文件“C:\Anaconda\lib\site packages\pandas\core\generic.py”,第1358行,在take中
convert=True,verify=True)
文件“C:\Anaconda\lib\site packages\pandas\core\internals.py”,第3275行,在take中
轴=轴,允许(重复=真)
reindex\U索引器中的文件“C:\Anaconda\lib\site packages\pandas\core\internals.py”,第3162行
适用于blk(自建区块)
文件“C:\Anaconda\lib\site packages\pandas\core\internals.py”,第857行,在take\n中
允许填充=真,填充值=填充值)
文件“C:\Anaconda\lib\site packages\pandas\core\common.py”,第844行,在take\n中
func(arr、索引器、out、fill_值)
文件“pandas\src\generated.pyx”,第5779行,位于pandas.algos.take_2d_axis1_object_object(pandas\algos.c:107426)中
文件“stringsource”,第614行,在View.MemoryView.MemoryView_cwrapper(pandas\algos.c:187433)中
文件“stringsource”,第321行,在View.MemoryView.MemoryView.\uuu cinit\uuu(pandas\algos.c:184022)中
ValueError:缓冲区源数组为只读

上次查询的问题:

print df.loc[df.groupby(['ColA']).agg(['count']) > 2]
就是df.loc[]需要一系列22个布尔对象。 相反,它得到的是一系列8个对象:

>>> df.groupby(['ColA']).agg(['count']) > 2
       ColB
      count
ColA       
A      True
B     False
C      True
D     False
E     False
F      True
G     False
H     False
所以它不知道如何把它们放在一起

但有一个解决办法。:)

首先,让我们将聚合df分配给一个新对象

>>> df_count = df.groupby(['ColA']).agg(['count']).ColB
>>> df_count.columns=['ColB']
然后我们可以很容易地过滤它

>>> df_count[df_count.ColB.values>2]
       ColB

ColA       
A         3
C         4
F         7
然后,我们可以使用过滤后的df返回并过滤原始df

>>> df_filtered=df_count[df_count.ColB.values>2]
>>> df[df.ColA.isin(df_filtered.index)]
   ColA ColB
0     A    1
1     A    2
2     A    3
5     C    6
6     C    7
7     C    8
8     C    9
12    F    3
13    F    4
14    F    5
15    F    6
16    F    7
17    F    8
18    F    9

df_filtered=df_count[df_count.values>2]
上,我收到
ValueError:buffer source array是只读的
,这很奇怪。。。这里的天气在0.14时很好。你用的是什么版本?你能打印df_count[df_count.values>2]吗?我正在使用pandas
0.16.2
是的,pandas 0.16中的功能似乎有所改变。我做了一些更改,并使用pd“0.16.1”在wakari上进行了测试,现在似乎可以工作了。
>>> df_count[df_count.ColB.values>2]
       ColB

ColA       
A         3
C         4
F         7
>>> df_filtered=df_count[df_count.ColB.values>2]
>>> df[df.ColA.isin(df_filtered.index)]
   ColA ColB
0     A    1
1     A    2
2     A    3
5     C    6
6     C    7
7     C    8
8     C    9
12    F    3
13    F    4
14    F    5
15    F    6
16    F    7
17    F    8
18    F    9