【问题标题】:Python dataframe running total based on a sort key基于排序键的 Python 数据帧运行总数
【发布时间】:2021-06-19 19:44:41
【问题描述】:

我希望获得每个排序键的运行总计。我已经检查了大部分帖子的 groupby 功能。但是,将它们按不同级别的排序键组合在一起仍然是我的问题。任何专家都可以帮助我解决这个问题!

非常感谢!!

这里有一个数据框:

dataframe

SORT KEY Value
A 4
AA 9
AAA 6
AAAA 2
AAAAA 56
AAB 6
AABA 2
AABAA 56
AB 9
ABA 6
ABAA 6
ABAAA 56

预期结果:

expected running total output

SORT KEY Value Running Total
A 4 4
AA 9 13
AAA 6 19
AAAA 2 21
AAAAA 56 77
AAB 6 19
AABA 2 21
AABAA 56 77
AB 9 13
ABA 6 19
ABAA 6 25
ABAAA 56 81

【问题讨论】:

  • MySQL 还是 Teradata?运行总数根据哪个逻辑重置?
  • 您好,dnoeth,感谢您的回复!输出来自 Teradata。在 Teredata 上进行查询或通过 Python 处理时,我可以计算运行总计。重置基于排序键。您可以在这里看到排序键应该是 A(值:5,运行总数:5)> AA(值:2,运行总数:7)>AAA(值:3,运行总数:10)。但有一个替代的 AAB 应该是(值:5,运行总计:5+7 = 12)。希望清楚!
  • 这真的很棘手。排序键真的看起来像您的示例 A-AA-AAB 等吗?逐个字符添加?
  • @dnoeth,是的。排序键按升序排列。运行总数是每个前一个字符串的总和。

标签: python teradata


【解决方案1】:

可能有一个基于 Windowed Aggregates 的解决方案,但这个任务似乎是递归的完美匹配:

WITH RECURSIVE cte AS
 ( 
   SELECT sort_key, val, val AS running_total, 1 AS len
   FROM tab AS t
   -- start with a single charcater
   WHERE  Char_Length(t.sort_key) = 1

   UNION ALL
   -- do the running total
   SELECT t.sort_key, t.val, running_total + t.val, cte.len +1
   FROM tab AS t
   JOIN cte -- next key starts with the previous key and adds a char
     ON Substring(t.sort_key FROM 1 FOR len) = cte.sort_key
    AND Char_Length(t.sort_key) = len +1 
 ) 
SELECT *
FROM cte
ORDER BY sort_key

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2017-10-29
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多