Python 如何将前置条件应用于GroupBy或如何忽略GroupBy中有一条记录的组

Python 如何将前置条件应用于GroupBy或如何忽略GroupBy中有一条记录的组,python,pandas,Python,Pandas,我有一组行,我想根据标识符的值对这些行进行分组(每行中都有),然后对这些组执行进一步的独立处理,这将是结果 我的数据框如下所示: In [50]: df Out[50]: groupkey b c d e date 0 C1 b1 c1 d1 e1 2014-10-26 12:13:14 1 C2 NaN c2 d2 e2 2014-11-02 12:13:14 2 C1 b3

我有一组行,我想根据标识符的值对这些行进行分组(每行中都有),然后对这些组执行进一步的独立处理,这将是结果

我的数据框如下所示:

In [50]: df
Out[50]: 
  groupkey    b    c   d   e                date
0       C1   b1   c1  d1  e1 2014-10-26 12:13:14
1       C2  NaN   c2  d2  e2 2014-11-02 12:13:14
2       C1   b3   c3  d3  e3 2014-11-09 12:13:14
3       C1   b4  NaN  d4  e4 2014-11-16 12:13:14
4       C3   b5   c5  d5  e5 2014-11-23 12:13:14
5       C2   b6   c6  d6  e6 2014-11-30 12:13:14
如果我要按
groupkey
分组,我知道我应该只处理由以下人员返回的
GroupBy

>> df.groupby('groupkey')

但是,在分组之前,为了减少数据集的大小,我不想考虑每一组只有一条记录的行(如果按上述方式分组)。 在我的示例中,这意味着应该忽略第4行

4

现在,在我看来,计算每组记录的最简单方法当然是先分组,然后计算记录,如下所示:

>> df.groupby('groupkey').count()
我想我可以这样做,然后删除只有一个记录的组

  • 我不知道如何在不必手动返回并删除只有一条记录的组的情况下修复此问题

  • 我想知道是否有一种方法可以通过某个函数进行分组,从而允许我在分组时考虑这个条件


  • 感谢您的帮助

    我想您可以先使用和过滤
    数据帧

    有趣的是,它作为解决方案更快(
    len(df)=6k
    ):

    您想使用组上的
    len
    创建
    groupby
    对象:

    In [9]:
    df.groupby('groupkey').filter(lambda x: len(x) > 1)
    
    Out[9]:
      groupkey    b    c   d   e                date
    0       C1   b1   c1  d1  e1 2014-10-26 12:13:14
    1       C2  NaN   c2  d2  e2 2014-11-02 12:13:14
    2       C1   b3   c3  d3  e3 2014-11-09 12:13:14
    3       C1   b4  NaN  d4  e4 2014-11-16 12:13:14
    5       C2   b6   c6  d6  e6 2014-11-30 12:13:14
    

    我喜欢这个。我在写我自己的答案,但这更复杂。你为什么使用
    df.groupkey
    而不是
    df['groupkey']
    ?原因是一样的,也许很好看。谢谢你的帮助,漂亮的方法和额外的性能分数。谢谢你的帮助,非常直截了当,正是我想要的。
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    In [21]: %timeit df[df.groupkey.map(df.groupkey.value_counts() != 1)]
    1000 loops, best of 3: 1.87 ms per loop
    
    In [22]: %timeit df.groupby('groupkey').filter(lambda x: len(x) != 1)
    100 loops, best of 3: 2.71 ms per loop
    
    In [9]:
    df.groupby('groupkey').filter(lambda x: len(x) > 1)
    
    Out[9]:
      groupkey    b    c   d   e                date
    0       C1   b1   c1  d1  e1 2014-10-26 12:13:14
    1       C2  NaN   c2  d2  e2 2014-11-02 12:13:14
    2       C1   b3   c3  d3  e3 2014-11-09 12:13:14
    3       C1   b4  NaN  d4  e4 2014-11-16 12:13:14
    5       C2   b6   c6  d6  e6 2014-11-30 12:13:14