【问题标题】:Group list of value by range then set the values of the group to a specified one按范围分组值列表,然后将组的值设置为指定的值
【发布时间】:2021-12-14 00:34:01
【问题描述】:

我有一些像这样的 python pandas 数据框。它列出了使用 ocr 提取的打印表中标签的位置。所以每个标签位置都有一点偏移。

     left  top       text
4     66   23  6/22/2021
6     66   82  6/23/2021
8     65  142  6/24/2021
10    65  202  6/25/2021
12    64  262  6/26/2021
16   345   25      14:00
18   354   85       7:30
20   344  145      13:00
22   344  206      11:00
24   343  265      10:00
26   343  325      15:00
30   859   23      20:30
32   860   84      14:00
34   858  144      20:23
36   859  204      18:00
38   858  264      13:00
40   858  324      18:15
44  1091   23       6:30
46  1091   84       6:30
48  1090  144       7:23
50  1090  204       7:00
52  1089  264       3:00
54  1089  324       3:15
56  1088  383       0:00
58  1087  443       0:00
60  1087  503       0:00
62  1047  563   33:38:00

我需要按“左”列值对数据进行排序,然后将每组值设置为特定值。

在这种情况下,前五个值 [66,66,65,65,64] 可以组合在一起,因为它们的范围很窄(例如 [60...70])。然后将前五个值设置为范围的最小值([60...70],但它可以是值的范围 [64...66])。

依此类推,对于每组值,按它们的值在一个狭窄范围内的事实进行分组。

每个组的大小(如果是随机的)。在这种情况下,最后一行的“左”值为 [1047]。它适合单个值组。

这些值也是随机的。据我了解,我无法使用此解决方案:how to group by list ranges of value in python pandas

然后我将对第二列“top”做同样的工作。

这样做的诀窍是什么?

我知道有一种数学方法可以做到这一点。我可以在某些 daw 中使用它来“锐化”声音。但也许有一种 python pandas 方法可以做到这一点。

我不是以英语为母语的人。所以我希望你能理解我。

感谢您的宝贵时间

编辑:

我想要的(但它可以是每个组的最小值,或者这里是组的第一个值):

     left  top       text
4     66   23  6/22/2021
6     66   82  6/23/2021
8     66  142  6/24/2021
10    66  202  6/25/2021
12    66  262  6/26/2021
16   345   25      14:00
18   345   85       7:30
20   345  145      13:00
22   345  206      11:00
24   345  265      10:00
26   345  325      15:00
30   859   23      20:30
32   859   84      14:00
34   859  144      20:23
36   859  204      18:00
38   859  264      13:00
40   859  324      18:15
44  1091   23       6:30
46  1091   84       6:30
48  1091  144       7:23
50  1091  204       7:00
52  1091  264       3:00
54  1091  324       3:15
56  1091  383       0:00
58  1091  443       0:00
60  1091  503       0:00
62  1047  563   33:38:00

【问题讨论】:

  • narrow range 是一个非常抽象的术语。也许您想按差异为 0 或 1 的值进行分组?
  • 请发布您预期的输出数据框
  • @Chris :我想按差异不高于 10 的值进行分组
  • @sammywemmy:完成

标签: python pandas math


【解决方案1】:

一种使用pandas.Series.diffcumsum 技巧来分组的方法。

然后将pandas.DataFrame.groupby.transform"min" 一起使用:

df = df.sort_values("left")
ind1 = df["left"].diff().fillna(0).gt(10).cumsum()
df["left_min"] = df.groupby(ind1)["left"].transform("min")

df = df.sort_values("top")
ind2 = df["top"].diff().fillna(0).gt(10).cumsum()
df["top_min"] = df.groupby(ind2)["top"].transform("min")

print(df.sort_index())

输出:

    left  top       text  left_min  top_min
4     66   23  6/22/2021        64       23
6     66   82  6/23/2021        64       82
8     65  142  6/24/2021        64      142
10    65  202  6/25/2021        64      202
12    64  262  6/26/2021        64      262
16   345   25      14:00       343       23
18   354   85       7:30       343       82
20   344  145      13:00       343      142
22   344  206      11:00       343      202
24   343  265      10:00       343      262
26   343  325      15:00       343      324
30   859   23      20:30       858       23
32   860   84      14:00       858       82
34   858  144      20:23       858      142
36   859  204      18:00       858      202
38   858  264      13:00       858      262
40   858  324      18:15       858      324
44  1091   23       6:30      1087       23
46  1091   84       6:30      1087       82
48  1090  144       7:23      1087      142
50  1090  204       7:00      1087      202
52  1089  264       3:00      1087      262
54  1089  324       3:15      1087      324
56  1088  383       0:00      1087      383
58  1087  443       0:00      1087      443
60  1087  503       0:00      1087      503
62  1047  563   33:38:00      1047      563

【讨论】:

  • 好吧,它似乎运作良好。但是我希望每个组都将它们的值设置为最小值。
  • @TH 第一组是 64、65 和 66,最小的是 64,这就是为什么transform("min")。但根据您的编辑,我想您想要 max?
  • 对不起。你说的对。你是个天才。非常感谢。
  • @TH 太好了!如果它解决了您的问题,请随意填写以标记答案已接受。作为新人,建议你看看when someone answers
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 2021-05-06
  • 2020-05-26
  • 2013-04-27
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多