Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:计算到下一个真值的定向距离_Python_Pandas - Fatal编程技术网

Python 熊猫:计算到下一个真值的定向距离

Python 熊猫:计算到下一个真值的定向距离,python,pandas,Python,Pandas,在pandas数据框中有一系列true/false,我想将此列转换为GrandClient,其中负值为false,正值为true,并在true和false之间插入0。 在我的代码中,零的插入应该是可选的 然后,当与下一个转换true/false的距离增加时,值应增加-1或+1 我正在琢磨如何用干净的python代码编写它 18年10月16日:我在帖子末尾添加了一个新的例子,但与当前答案不符 因此: 0 False 1 False 2 False 3 False 4 True 5 True 6

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

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

我正在琢磨如何用干净的python代码编写它

18年10月16日:我在帖子末尾添加了一个新的例子,但与当前答案不符

因此:

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

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

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


非常感谢你的回答。不幸的是,它没有像预期的那样工作。我添加了第二个例子,上面的代码失败了。也许我的问题不是很清楚。对不起that@tommy123这只是一个需要解决的小细节。看编辑的代码非常感谢您的时间,非常感谢。
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