代码之家  ›  专栏  ›  技术社区  ›  Yuca

使用pandas groupby检查组中的所有元素是否相等

  •  3
  • Yuca  · 技术社区  · 6 年前

    是否有一种方法可以按字段分组并检查每个结果组的所有元素是否具有相同的值?

    样本数据:

                  datetime rating  signal
    0  2018-12-27 11:33:00     IG       0
    1  2018-12-27 11:33:00     HY      -1
    2  2018-12-27 11:49:00     IG       0
    3  2018-12-27 11:49:00     HY      -1
    4  2018-12-27 12:00:00     IG       0
    5  2018-12-27 12:00:00     HY      -1
    6  2018-12-27 12:49:00     IG       0
    7  2018-12-27 12:49:00     HY      -1
    8  2018-12-27 14:56:00     IG       0
    9  2018-12-27 14:56:00     HY      -1
    10 2018-12-27 15:12:00     IG       0
    11 2018-12-27 15:12:00     HY      -1
    12 2018-12-20 15:14:00     IG       0
    13 2018-12-20 15:14:00     HY      -1
    14 2018-12-20 15:50:00     IG      -1
    15 2018-12-20 15:50:00     HY      -1
    16 2018-12-27 13:26:00     IG       0
    17 2018-12-27 13:26:00     HY      -1
    18 2018-12-27 13:44:00     IG       0
    19 2018-12-27 13:44:00     HY      -1
    20 2018-12-27 15:06:00     IG       0
    21 2018-12-27 15:06:00     HY      -1
    22 2018-12-20 15:48:00     IG       0
    23 2018-12-20 15:48:00     HY      -1
    

    分组部分可以通过

    df.groupby([datetime.dt.date,'rating'])
    

    但是,我相信必须有一种简单的方法来利用Grouper,并使用Transform语句返回1,如果 signal 都一样。

    期望输出

    2018-12-20  HY            True
                IG            False
    2018-12-27  HY            True
                IG            True
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   cs95 abhishek58g    6 年前

    使用 groupby nunique ,并检查结果是否为1:

    df.groupby([df.datetime.dt.date, 'rating']).signal.nunique().eq(1)
    
    datetime    rating
    2018-12-20  HY         True
                IG        False
    2018-12-27  HY         True
                IG         True
    Name: signal, dtype: bool
    

    或者,类似地,使用 apply 具有 set 转换:

    (df.groupby([df.datetime.dt.date, 'rating']).signal
       .apply(lambda x: len(set(x)) == 1))
    
    datetime    rating
    2018-12-20  HY         True
                IG        False
    2018-12-27  HY         True
                IG         True
    Name: signal, dtype: bool
    

    另外,您不需要分配临时列, 子句 采用任意的Grouper参数。

        2
  •  2
  •   BENY    6 年前

    试着找到替代品而不使用 groupby 只是为了好玩

    df.datetime=df.datetime.dt.date
    
    s=pd.crosstab(df.datetime,[df.rating,df.signal])
    
    
    s.eq(s.sum(axis=1,level=0),1).any(level=0,axis=1).stack()
    Out[556]: 
    datetime    rating
    2018-12-20  HY         True
                IG        False
    2018-12-27  HY         True
                IG         True
    dtype: bool