【问题标题】:Pandas - how to get count of negative and positive values in a rowPandas - 如何连续计算负值和正值
【发布时间】:2018-11-24 19:37:04
【问题描述】:

如何在 pandas 中没有很多循环的情况下连续计算负值和正值的数量(计数)和总和?我想获得连续负数的最大总和以及连续正数的最大总和。示例数据框:

datetime                 Value
2018-11-12 15:10:00       2.00
2018-11-12 15:20:00     -10.50
2018-11-12 15:30:00      10.50
2018-11-12 15:40:00       7.50
2018-11-12 15:50:00       8.00
2018-11-12 16:10:00     -20.00
2018-11-12 16:20:00     -10.00

我希望输出是:

Max # of negatives in a row: 2, Total value = -30.00
Max # of positives in a row: 3, Total value =  26.00

一个简单的pd.groupby() 并不能解决问题,因为它没有对订单进行分组。也许某种sql查询? pd.query()?

【问题讨论】:

  • 您能解释一下您的预期输出吗?是否按照共享输入?
  • 行?还是专栏?您的示例输出和示例数据似乎不匹配。我假设您希望“值”列显示正数和负数,这将使 -40 的值成为 #3 负数,而 27 的值将成为 #4 正数。
  • 输出匹配..我想要连续的负数,并将它们的总值相加。由于它是时间序列,我想看看连续发生了多少个负数,以及总和是多少。我也希望这是积极的,但如果我想出另一个应该很容易。
  • 恐怕我没跟上。你能详细说明一下吗?例如,请指出在您的示例中一起使用的加起来为 -30 的值。
  • @ParitoshSingh 看起来 26 是 10.50 + 7.50 + 8.00,而 -30 是 -20.00 和 -10.00 的最后两行 - 不确定前两行发生了什么或其他方面发生了什么负面/正面虽然......马特 - 你能详细说明预期的输出,也许改写你的标准 - 这有点模棱两可吗?

标签: python pandas


【解决方案1】:

我的方法是首先给每个“连续相同的符号”分组一个不同的数字,以便继续使用groupby
将 Value 与其移位数组的符号进行比较给出了这些组的分隔符。如果需要,累积求和会产生唯一的数字和标识符:

df['grpnum'] = (np.sign(df.Value) != np.sign(df.Value.shift())).cumsum()

然后你可以通过这个标识符进行分组并计算组的长度、总和及其符号:

ranking = df.groupby('grpnum').agg([sum, len, lambda x: sum(x)>0]).Value

导致

         sum  len  <lambda>
grpnum                     
1        2.0  1.0      True
2      -10.5  1.0     False
3       26.0  3.0      True
4      -30.0  2.0     False

print(ranking.groupby('<lambda>')['sum', 'len'].apply(lambda g: g[g['len']==g['len'].max()]))

                  sum  len
<lambda> grpnum           
True     3       26.0  3.0
False    4      -30.0  2.0

【讨论】:

  • 几年后回到这个话题。只是为了提高性能而采取的后续措施:ranking = df.groupby('grpnum')['Value'].agg([sum, len, lambda x: sum(x)&gt;0]) 更快,因为它不会将整个 df 传递给 groupby
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2022-12-20
相关资源
最近更新 更多