熊猫:计算到下一个真实物体的距离

时间:2018-10-14 18:21:47

标签: python pandas

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

然后,当下一个过渡的真/假距离增加时,值应增加-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

我的问题与这一问题非常相似:How to count distance to the previous zero in pandas series?

非常感谢您分享知识。

编辑: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

我不明白为什么。

1 个答案:

答案 0 :(得分: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