对于每个 ID 组,考虑到已排序的 A 字段,有没有办法检查 B 字段中值的重复? (见下面的例子)

Posted

技术标签:

【中文标题】对于每个 ID 组,考虑到已排序的 A 字段,有没有办法检查 B 字段中值的重复? (见下面的例子)【英文标题】:Is there any way to check the repetition of the value in a B field, taking into account a sorted A field, for each ID group? (See example below) 【发布时间】:2022-01-05 08:27:48 【问题描述】:

假设我们有一个包含数千个用户的表,其中包含一个 ID、一个 year-month 和一个 balance($)。 让我们用 3 个用户将其简化为下表:

user ID (numeric) year-month (string) balance(float)
1 2019-01 500.0
1 2019-02 500.0
1 2019-03 0.0
1 2019-04 500.0
1 2019-05 0.0
1 2019-06 0.0
2 2018-09 1000.0
2 2018-10 1000.0
2 2018-11 750.0
2 2018-12 500.0
2 2019-01 0.0
2 2019-02 0.0
2 2019-03 0.0
2 2019-04 0.0
2 2019-05 0.0
2 2019-06 0.0
2 2019-07 0.0
3 2018-01 200.0
3 2018-02 0.0
3 2018-03 200.0
3 2018-04 0.0

主要规则是:如果给定月份的余额为0,那么之后的一个月余额值不能为0。这意味着唯一能够正确报告其记录的用户将是 ID=2。

作为最终输出,我想要一个表格,显示有多少用户 ID 满足规则,有多少不满足:

well_informed num_cases
YES 1
NO 2

由于难以遍历用户 ID 的连续记录并检查条件,我尝试了几件事,甚至没有接近结果。

Python-Pandas 和 SQL 的解决方案对我工作的环境都有效。非常感谢!

EDIT v1:@db @Henry Ecker 解决方案适用于我提供的示例,但不适用于我的问题,因为我没有指定一些有效的情况,例如:

user ID (numeric) year-month (string) balance(float)
4 2019-02 1000.0
4 2019-03 1000.0
4 2019-04 1000.0
4 2019-05 1000.0
4 2019-06 1000.0
4 2019-07 1000.0
4 2019-08 1000.0
4 2019-09 1000.0
4 2019-10 1000.0
4 2019-11 1000.0
4 2019-12 1000.0

应该被认为是 TRUE,但将其归类为 FALSE。

【问题讨论】:

【参考方案1】:

对于每个ID,对balance 执行运行长度编码,并检查是否只有该编码的最后一个值是0

import pdrle

def foo(x):
    rle = pdrle.encode(x.eq(0))
    if rle.vals.sum() == 0:
        return True
    if rle.vals.sum() == 1:
        return rle.vals.tail(1).item()
    return False


ans = dat.groupby(dat["user ID"], as_index=False).balance.apply(foo)
ans
#     user ID     balance
# 0         1       False
# 1         2        True
# 2         3       False

下一步可以总结ans

ans.groupby("balance").size()
# balance
# False    2
# True     1
# dtype: int64

【讨论】:

首先,非常感谢您的回复。它适用于我特别提出的示例,但不适用于我的问题,因为我没有指定一些有效的情况,例如:假设您有一个新的 id=4 有 5 行,它们都在其中价值 1000 美元。信息是正确的,所以它会是 True,但它会算作 False。这可以在你写的代码上处理吗? @0xGolovkin,立即查看

以上是关于对于每个 ID 组,考虑到已排序的 A 字段,有没有办法检查 B 字段中值的重复? (见下面的例子)的主要内容,如果未能解决你的问题,请参考以下文章

mysql按字段分组并获取每个分组按照某个字段排序的前三条

mysql根据某个字段内容排序

从每个组中获取最新记录

sql 分组排序

Mongodb 按日期排序

根据第二个数组对 NSManagedObjects 数组进行排序