对于每个 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 字段中值的重复? (见下面的例子)的主要内容,如果未能解决你的问题,请参考以下文章