我对python比较陌生。我尝试为每个客户端计算累积总和,以查看相应的不活动月份(标志:1 或 0)。因此,当我们有一个 0 时,需要重置 1 的累积总和。当我们有一个新客户时,也需要重置。请参见下面的示例,其中 a 是客户列,b 是日期。
经过一番研究,我发现了问题“Cumsum reset at NaN”和“In Python Pandas using cumsum with groupby”。我想我有点需要把它们放在一起。将 'Cumsum reset at NaN' 的代码调整为向 0 的重置是成功的:
cumsum = v.cumsum().fillna(method='pad')
reset = -cumsum[v.isnull() !=0].diff().fillna(cumsum)
result = v.where(v.notnull(), reset).cumsum()
Run Code Online (Sandbox Code Playgroud)
但是,我没有成功添加 groupby。我的数还在继续……
所以,一个数据集应该是这样的: import pandas as pd
df = pd.DataFrame({'a' : [1,1,1,1,1,1,1,2,2,2,2,2,2,2],
'b' : [1/15,2/15,3/15,4/15,5/15,6/15,1/15,2/15,3/15,4/15,5/15,6/15],
'c' : [1,0,1,0,1,1,0,1,1,0,1,1,1,1]})
Run Code Online (Sandbox Code Playgroud)
这应该会产生一个包含 a、b、c 和 d 列的数据框
'd' : [1,0,1,0,1,2,0,1,2,0,1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
请注意,我有一个非常大的数据集,因此计算时间非常重要。
感谢你们对我的帮助
这是我第一次提问,所以请耐心等待。
我的数据集(df)是这样的:
animal azimuth south distance
pb1 187.561 1 1.992
pb1 147.219 1 8.567
pb1 71.032 0 5.754
pb1 119.502 1 10.451
pb2 101.702 1 9.227
pb2 85.715 0 8.821
Run Code Online (Sandbox Code Playgroud)
我想创建一个额外的列 ( df$cumdist) 来增加累积距离,但在每个单独的动物中,并且仅当df$south==1. 我希望累积总和用df$south==0.
这就是我想要的结果(手动完成):
animal azimuth south distance cumdist
pb1 187.561 1 1.992 1.992
pb1 147.219 1 8.567 10.559
pb1 71.032 0 5.754 0
pb1 119.502 1 10.451 10.451
pb2 101.702 1 9.227 9.227
pb2 85.715 0 8.821 0
Run Code Online (Sandbox Code Playgroud)
这是我试图实现 cumsum 的代码:
swim.az$cumdist …Run Code Online (Sandbox Code Playgroud) 是否可以cumsum()在另一列上以开始 - 停止条件迭代地使用一列:
df具有一列的数据框,X其中值是递增的。cumsum() 应在达到 10 或 10 的倍数时停止(例如 20、30、40,...)。cumsum则应在最后一次出现 10、20、30、40 时停止...这是数据帧:df <- structure(list(X = c(55L, 95L, 39L, 52L, 22L, 93L, 76L, 82L,
77L, 58L, 60L, 19L, 31L, 43L, 65L, 56L, 18L, 66L, 21L, 49L, 13L,
37L, 36L, 51L, 41L, 7L, 91L, 3L, 11L, 65L, 51L, 32L, 25L, 10L,
5L, 7L, 8L, 3L, 72L, 66L, 93L, 24L, 48L, 44L, 91L, 60L, 62L,
89L, …Run Code Online (Sandbox Code Playgroud) 我有以下数据框:
| 班级 | 已收到 | 发布 |
|---|---|---|
| FD | 10 | 0 |
| FD | 0 | 2 |
| R M | 5 | 0 |
| R M | 0 | 3 |
| FD | 0 | 2 |
| 下午 | 5 | 0 |
| 下午 | 1 | 0 |
| R M | 1 | 0 |
| FD | 4 | 0 |
我需要下面的数据框:
| 班级 | 已收到 | 发布 | 剩余数量 |
|---|---|---|---|
| FD | 10 | 0 | 10 |
| FD | 0 | 2 | 8 |
| R M | 5 | 0 | 5 |
| R M | 0 | 3 | 2 |
| FD | 0 | 2 | 6 |
| 下午 | 5 | 0 | 5 |
| 下午 | 1 | 0 | 6 |
| R M | 1 | 0 | 3 |
| FD | 4 | 0 | 10 |
剩余数量列是每个班级收到的-发出的 cumsum() …
如何在按行操作时应用能够"看到"前面结果的函数?
这出现了很多,但我目前的问题需要学生运行总计,如果总数没有达到5则重置.
示例数据:
> df
row Student Absent Consecutive.Absences
1 A 0 0
2 A 1 1
3 A 1 2
4 A 0 0 <- resets to zero if under 5
5 A 0 0
6 A 1 1
7 A 1 2
8 A 1 3
9 B 1 1 <- starts over for new factor (Student)
10 B 1 2
11 B 0 0
12 B 1 1
13 B 1 2
14 B 1 3
15 …Run Code Online (Sandbox Code Playgroud) 有人可以帮我理解为什么-1 + 1 <> 0?
有人可以帮助我理解为什么我在内置函数consum(),我的函数ct()和Excel之间得到三个不同的值,当它们都在做同样的事情时?
现在,我很确定答案是一个"回合"问题,但我无法弄清楚这个问题的部分来自何处.我的意思是,这一切"看起来非常简单.
在R中,当我构建序列'a'然后运行cumsum(a)时,我没有像我期望的那样得到0的结果.如果我尝试使用函数计算相同的值,我也会得到不同的答案.最后,如果我尝试使用Excel计算相同的值,我会得到第三个答案.
这是我使用cumsum()得到的:
> a<- seq(-1, 1, by=.1)
> a
[1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3
[15] 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> cumsum(a)
[1] -1.000000e+00 -1.900000e+00 -2.700000e+00 -3.400000e+00 -4.000000e+00
[6] -4.500000e+00 -4.900000e+00 -5.200000e+00 -5.400000e+00 -5.500000e+00
[11] -5.500000e+00 -5.400000e+00 -5.200000e+00 -4.900000e+00 -4.500000e+00
[16] -4.000000e+00 -3.400000e+00 -2.700000e+00 -1.900000e+00 -1.000000e+00
[21] 1.110223e-15
Run Code Online (Sandbox Code Playgroud)
我写了一个快速函数来测试这个并期望得到相同的答案(或0),但我得到一个完全不同的答案.这是我的功能及其结果:
ct<- function(x){
result = 0
for(i in 1:length(x)){
cat(i, ": Result = …Run Code Online (Sandbox Code Playgroud) 使用pandas,在前n个元素上计算滚动cumsum的最简单方法是什么,例如计算尾随三天的销售额:
df = pandas.Series(numpy.random.randint(0,10,10), index=pandas.date_range('2020-01', periods=10))
df
2020-01-01 8
2020-01-02 4
2020-01-03 1
2020-01-04 0
2020-01-05 5
2020-01-06 8
2020-01-07 3
2020-01-08 8
2020-01-09 9
2020-01-10 0
Freq: D, dtype: int64
Run Code Online (Sandbox Code Playgroud)
期望的输出:
2020-01-01 8
2020-01-02 12
2020-01-03 13
2020-01-04 5
2020-01-05 6
2020-01-06 13
2020-01-07 16
2020-01-08 19
2020-01-09 20
2020-01-10 17
Freq: D, dtype: int64
Run Code Online (Sandbox Code Playgroud) 在R中,如何在计算行之前的定义时间段内计算cumsum?如果可能的话,首选dplyr.
例如,如果期间是10天,那么函数将实现cum_rolling10:
date value cumsum cum_rolling10
1/01/2000 9 9 9
2/01/2000 1 10 10
5/01/2000 9 19 19
6/01/2000 3 22 22
7/01/2000 4 26 26
8/01/2000 3 29 29
13/01/2000 10 39 29
14/01/2000 9 48 38
18/01/2000 2 50 21
19/01/2000 9 59 30
21/01/2000 8 67 38
25/01/2000 5 72 24
26/01/2000 1 73 25
30/01/2000 6 79 20
31/01/2000 6 85 18
Run Code Online (Sandbox Code Playgroud) 我有一个如下的数据帧.
idx vals
0 10
1 21
2 12
3 33
4 14
5 55
6 16
7 77
Run Code Online (Sandbox Code Playgroud)
我想执行cumsum(并避免使用for)但只考虑具有相同的行idx mod 2.例如,对于第3行,我想获得21+33=54,而对于第4行,10+12+14 = 36.
有任何想法吗?
我的问题与小组中的“求和”非常相似,并在熊猫和熊猫中按条件重置:基于附加条件的每个类别的求和,但由于我的条件要求,它们并不能使我到达那里。我有一个看起来像这样的数据框:
TransactionId Delta
14 2
14 3
14 1
14 2
15 4
15 2
15 3
Run Code Online (Sandbox Code Playgroud)
我想创建另一个列“累积”,该列为每个TransactionId计算Delta的总和。因此结果将如下所示:
TransactionId Delta Cumulative
14 2 2
14 3 5
14 1 6
14 2 8
15 4 4
15 2 6
15 3 9
Run Code Online (Sandbox Code Playgroud)
我具有检查TransactionId相等性设置的条件:
c1 = df.TransactionId.eq(df.TransactionId.shift())
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何将Delta值添加到上一个“累积行”中。