返回

python—在熊猫数据帧中按组对范围之间的值进行累积计数

发布时间:2022-05-19 17:44:05 284
# node.js

假设我有以下数据。对于每个 user_id,我希望每次差异分数 <= -2 时都获得一个累积计数,直到它达到一个正值。然后计数应重置为零并保持该值,直到该用户遇到下一个 <= -2,然后计数再次从 1 开始,直到达到下一个正值。结果应该等同于我在 cum_count 中的结果。

我知道这应该很容易,但这让我很难过......

df = pd.DataFrame({'user_id': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
                   'difference_score': [0.0, 1.0, -2.5, -2.5, -0.5, -1.5, 2.25, 2.25, -1.86, 0.0, -0.33, -1.33, -2.33, 0.0, 1.0, -2.67, -0.67, -0.67, 0.67, -0.33, -0.33, 1.0],
                   'cum_count': [0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0]})

print(df)

        user_id  difference_score  cum_count
0         1            0.0000          0
1         1            1.0000          0
2         1           -2.5000          1
3         1           -2.5000          2
4         1           -0.5000          3
5         1           -1.5000          4
6         1            2.2500          0
7         1            2.2500          0
8         2           -1.8571          0
9         2            0.0000          0
10        2           -0.3333          0
11        2           -1.3333          0
12        2           -2.3333          1
13        2            0.0000          0
14        3            1.0000          0
15        3           -2.6667          1
16        3           -0.6667          2
17        3           -0.6667          3
18        3            0.6667          4
19        3           -0.3333          5
20        3           -0.3333          6
21        3            1.0000          0

编辑:根据您的解决方案 mozway,我发现了几个实例,其中建议的解决方案没有产生预期的结果。抱歉,我的示例数据不够广泛。我现在扩展了上面的示例数据以突出显示这一点。

例如,在下面更新的数据框中,第 14 行 cum_count 应该为 0,因为它是一个新用户,并且差异分数 > -2。但是,cum_count2 产生 1。

此外,一旦达到正值并且计数重置为 0,下次遇到该用户的值 <= -2 时,计数应重新从 1 开始。但是,在第 19 行,cum_count2 继续从以前的计数。与当前解决方案在 cum_count2 中返回的值相比,更新后的 cum_count 列具有我期望返回的值...


df = pd.DataFrame({'user_id': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3], 'difference_score': [0.0, 1.0, -2.5, -2.5, -0.5, -1.5, 2.25, 2.25, -1.86, 0.0, -0.33, -1.33, -2.33, -2.0, -1.0, -2.67, -0.67, -0.67, 0.67, -2.5, -0.33, 1.0], 'cum_count': [0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 0]}) print(df) user_id difference_score cum_count cum_count2 0 1 0.00 0 0 1 1 1.00 0 0 2 1 -2.50 1 1 3 1 -2.50 2 2 4 1 -0.50 3 3 5 1 -1.50 4 4 6 1 2.25 0 0 7 1 2.25 0 0 8 2 -1.86 0 0 9 2 0.00 0 0 10 2 -0.33 0 0 11 2 -1.33 0 0 12 2 -2.33 1 1 13 2 -2.00 2 2 14 3 -1.00 0 1 15 3 -2.67 1 2 16 3 -0.67 2 3 17 3 -0.67 3 4 18 3 0.67 0 0 19 3 -2.50 1 5 20 3 -0.33 2 6 21 3 1.00 0 0
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像