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]吗?我正在使用pandas0.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