使用 pandas GroupBy 检查组中的所有元素是不是相等

Posted

技术标签:

【中文标题】使用 pandas GroupBy 检查组中的所有元素是不是相等【英文标题】:Check if all elements in a group are equal using pandas GroupBy使用 pandas GroupBy 检查组中的所有元素是否相等 【发布时间】:2019-05-25 19:51:51 【问题描述】:

有没有一种 Python 的方式来按字段分组并检查每个结果组的所有元素是否具有相同的值?

样本数据:

              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'])

但是,如果signal 中的所有值都相同,我确信必须有一种简单的方法来利用 grouper 并使用转换语句返回 1。

期望的输出

2018-12-20  HY            True
            IG            False
2018-12-27  HY            True
            IG            True

【问题讨论】:

你能查一下len(set(your_values)) == 1吗? 我在您的输入 df 中没有看到任何 'temp' 应该是[True, False, True, False]吗? 嗯,我看到 2018-12-27/IG 有 [0, -1] 作为唯一值。可以看看吗? @coldspeed 修复了样本数据,谢谢! 【参考方案1】:

使用groupbynunique,检查结果是否为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

或者,类似地,使用applyset 转换:

(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

PS.,您不需要分配临时列,groupby 采用任意分组参数。

【讨论】:

跟进:有没有一种简单的方法可以恢复“奇一出”的索引?我们可以假设每天只有一个 @Yuca 你的意思是每天只有一个奇数输出(真或假)?有没有可能没有奇数? 是的,可能没有奇怪的结果,我有一种非常丑陋的做法,涉及使用 grouby 两次:S【参考方案2】:

尝试找出替代方案,而不是为了好玩而使用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

【讨论】:

我有一个挑战,如果它不是当天的最后一个条目,请提交false :)

以上是关于使用 pandas GroupBy 检查组中的所有元素是不是相等的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用mean函数计算每个分组中的所有数值变量的聚合平均值

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算每个分组中的所有数值变量的聚合加和值

Groupby 名称用所有列中的最大值替换值 pandas

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用get_group函数获取指定分组变量的具体分类值下的所有样本(获取的是多个分组中的其中一个分组的内容)

如何在 pandas 数据框中从 groupby 的结果生成所有值对

如何使用 groupby 调整 pandas 中的小计列?