groupby并返回前n个组的所有行

2024-06-25 06:27:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧如下

>>> df.head()
       0      1       2          3   4           5                      6
0  35000  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000CE
1  35001  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000PE
2  35002  26000  OPTIDX      NIFTY  XX  1609425000      NIFTY20DEC10400CE
3  35003  26000  OPTIDX      NIFTY  XX  1609425000      NIFTY20DEC10400PE
4  35004  26009  OPTIDX  BANKNIFTY  XX  1499956200  BANKNIFTY1771321100CE

我想按第5列的顺序将这些分组,并返回前n个组,其中n可以作为变量。在

我做了df.sort_values(5).groupby([5])我得到了<pandas.core.groupby.DataFrameGroupBy object at 0x2afc8d0>

如何获取前两组中的所有行。在上述样本中,组1为1499351400,组2为1499351400,组3为1609425000

预期输出:当所需组数=2时

^{pr2}$

更新1:在尝试@jezrael's之后

>>> k2=k1[k1.groupby(5).ngroup() < 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/python/2.7/lib/python2.7/site-packages/pandas/core/groupby.py", line 529, in __getattr__
    (type(self).__name__, attr))
AttributeError: 'DataFrameGroupBy' object has no attribute 'ngroup'

另外:如果没有熊猫(只有python)也可以这样做吗,我可能并不总能找到带熊猫的机器。谢谢


Tags: incorepandasdfobjectlinek1file
2条回答

如果不能使用ngroup,只需用'dense'对元素进行排序,并使用它来索引df:

In [24]: df.loc[df[5].rank(method='dense') <= 2]
Out[24]: 
       0      1       2          3   4           5                      6
0  35000  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000CE
1  35001  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000PE
4  35004  26009  OPTIDX  BANKNIFTY  XX  1499956200  BANKNIFTY1771321100CE

这是因为rank(method='dense')给了我们看到的每个数字的排序等级:

^{pr2}$

(注:在一个奇怪的巧合中,我加了ngroup和{},所以这个问题让我很高兴。:-)

^{}(在0.20.2中工作)与^{}一起使用:

df = df.sort_values(5)

print (df.groupby(5).ngroup())
0    0
1    0
4    1
2    2
3    2
dtype: int64

df = df[df.groupby(5).ngroup() < 2]
print (df)
       0      1       2          3   4           5                      6
0  35000  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000CE
1  35001  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000PE
4  35004  26009  OPTIDX  BANKNIFTY  XX  1499956200  BANKNIFTY1771321100CE

对于旧版本的pandas,使用一些hack-information隐藏在object grouper.group_info中,因此按[0]选择第一个数组:

^{pr2}$

^{}的替代解决方案:

df = df.sort_values(5)
df = df[pd.factorize(df[5])[0] < 2]
print (df)
       0      1       2          3   4           5                      6
0  35000  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000CE
1  35001  26009  OPTIDX  BANKNIFTY  XX  1499351400  BANKNIFTY1770621000PE
4  35004  26009  OPTIDX  BANKNIFTY  XX  1499956200  BANKNIFTY1771321100CE

相关问题 更多 >