我在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
我不明白为什么。
答案 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