【问题标题】:groupby and return all rows of first n groupsgroupby 并返回前 n 组的所有行
【发布时间】:2017-12-06 16:40:59
【问题描述】:

我有一个如下所示的熊猫数据框

>>> 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>

如何获取前 2 组中的所有行。在上面的示例 df 中,第 1 组为 1499351400,第 2 组为 1499351400,第 3 组为 1609425000

预期输出:当需要组时 =2

       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

更新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)是否可以做到这一点,我可能并不总能找到带有熊猫的机器。谢谢

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    如果您不能使用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') 为我们提供了每个看到的数字的排序排名:

    In [25]: df[5].rank(method='dense')
    Out[25]: 
    0    1.0
    1    1.0
    2    3.0
    3    3.0
    4    2.0
    Name: 5, dtype: float64
    

    (P.S. 一个奇怪的巧合,我把ngroupmethod='dense'都加了,所以这个问题让我很高兴。:-)

    【讨论】:

    • 谢谢,我们为什么使用 .loc ?而不仅仅是df[df[5].rank(method='dense') &lt;= 2]
    【解决方案2】:

    ngroup(在0.20.2工作)与boolean indexing一起使用:

    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 使用一点技巧 - 信息隐藏在对象 grouper.group_info 中,因此请选择 [0] 的第一个数组:

    df = df.sort_values(5)
    
    print (df.groupby([5]).grouper.group_info)
    (array([0, 0, 2, 2, 1], dtype=int64), array([0, 1, 2]), 3)
    
    print (df.groupby([5]).grouper.group_info[0])
    [0 0 2 2 1]
    
    df = df[df.groupby([5]).grouper.group_info[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
    

    factorize 的替代解决方案:

    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
    

    【讨论】:

    • ngroup 是组数吗?谁的索引从 0 右开始
    • 没错,我为您的数据添加输出。
    • 这是熊猫最后版本0.20.2中的新功能。 Mybe有问题。
    • 我的是 0.19.2,除了 ngroup 之外还有其他方法可以在 0.19.2 中使用
    • 给我一些时间。
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多