Панды: вычислить ориентированное расстояние до следующего истинного - PullRequest
0 голосов
/ 14 октября 2018

У меня есть серия true / false во фрейме данных pandas, и я хочу преобразовать этот столбец в грандиозный с отрицательными значениями в False, положительными значениями в true и вставить 0 между истиной и ложью.Вставка нуля должна быть чем-то необязательным в моем коде.

Затем значения должны быть увеличены на -1 или +1, когда расстояние со следующим переходом true / false увеличивается.

Iя задаюсь вопросом, как написать это в чистом коде 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

И я не понимаюпочему.

1 Ответ

0 голосов
/ 14 октября 2018

Таким образом, по определению, значения будут градиентом, если они находятся в середине кадра данных, и просто обратным диапазоном, если они являются первой или последней группой.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...