熊猫:计算到下一个 true 的距离



我在熊猫数据框中有一系列真/假,我想将此列转换为一个 grandient,其中负值为 False,正值为 true,并在真和假之间插入 0。 在我的代码中,插入零应该是可选的。

然后,当下一个转换 true/false 的距离增加时,这些值应递增 -1 或 +1。

我正在指导如何用干净的python代码编写它。

16/10/18:我在帖子末尾添加了一个新示例,该示例在当前答案中失败。

所以这个:

0 False 
1 False
2 False
3 False
4 True
5 True
6 True
7 True
8 True 
9 True 
10 False
11 False 
12 False 
13 False 
14 False 
15 True 
16 True 
17 True 
18 True 
19 True 
20 False

会给:

0 False=> -4
1 False=> -3
2 False=> -2
3 False=> -1
=>0  
4 True =>+1
5 True => +2
6 True=> +3
7 True=> +3
8 True => +2
9 True => +1
=>0
10 False =>-1
11 False => -2
12 False => -3
13 False =>-2
14 False => -1
=>0
15 True =>+1
16 True =>+2
17 True =>+3
18 True =>+2
19 True =>+1
=>0
20 False=>-1

这是另一个例子: 例如这里

False
False
False
False
True
True
True
True
True
True
True
True
True
True
False
False
False
False
False
False
False
False
False
False`

这应该给出:

0     -4
1     -3
2     -2
3     -1
4      1
5      2
6      3
7      4
8      5
9      5
10     4
11     3
12     2
13     1
14    -1
15    -2
16    -3
17    -4
18    -5
19    -6
20    -7
21    -8
22    -9
23    -10

我的问题与此非常相似:如何计算熊猫系列中到前一个零的距离?

非常感谢您分享您的知识。

编辑:来自RafaelC的答案不起作用,因为它在第二个示例中给出了以下结果:

0     -4
1     -3
2     -2
3     -1
4      1
5      2
6      3
7      4
8      5
9      5
10     4
11     3
12     2
13     1
14   -10
15    -9
16    -8
17    -7
18    -6
19    -5
20    -4
21    -3
22    -2
23    -1

在索引 14 处,它给出 -10 而不是 -1

编辑/编辑: 在这种情况下,RaphaelC 的最后一个答案不起作用:

False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
True
True
True
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False

该函数返回为错误:

~/anaconda3/lib/python3.6/site-packages/pandas/core/groupby/groupby.py in transform(self, func, *args, **kwargs)
3659 
3660             indexer = self._get_index(name)
-> 3661             s = klass(res, indexer)
3662             results.append(s)
3663 
~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in __init__(self, data, index, dtype, name, copy, fastpath)
259                             'Length of passed values is {val}, '
260                             'index implies {ind}'
--> 261                             .format(val=len(data), ind=len(index)))
262                 except TypeError:
263                     pass
ValueError: Length of passed values is 2, index implies 3

我不明白为什么。

因此,根据定义,如果值位于数据框的中间,则值将是梯度,如果它们是第一组或最后一组,则只是反向范围。

g = df.groupby((df.col != df.col.shift()).cumsum())
n_groups = len(g)
def f(s):
n = len(s)//2
t = s.all().all()
if s.name == 1:
x = list(range(len(s), 0, -1))
elif s.name == n_groups:
x = list(range(1, len(s)+1))
else:
x = list(range(1,n+1)) + list(range(n if n!=1 else n+1,0,-1))
if n%2 == 0: x.insert(n,n+1)
return pd.Series(x) * (1 if t else -1)
g['col'].transform(f).reset_index(drop=True)

收益 率

0    -4
1    -3
2    -2
3    -1
4     1
5     2
6     3
7     3
8     2
9     1
10   -1
11   -2
12   -3
13   -2
14   -1
15    1
16    2
17    3
18    2
19    1
20   -1

0     -4
1     -3
2     -2
3     -1
4      1
5      2
6      3
7      4
8      5
9      5
10     4
11     3
12     2
13     1
14    -1
15    -2
16    -3
17    -4
18    -5
19    -6
20    -7
21    -8
22    -9
23   -10

最新更新