Pandas - Как рассчитать последовательные ложные значения с момента последнего появления True во временном ряду без зацикливания? - PullRequest
0 голосов
/ 03 марта 2020

есть ли решение Pythoni c с pandas для данной проблемы?

Предположим, я замаскировал ряд с именем A

[False, True, False, False, False, True, False, False]

Я хочу получить серию, в которой подсчитываются ложные значения с момента последнего появления True. Для приведенного выше примера это выдает что-то вроде:

[NaN, 0, 1, 2, 3, 0, 1, 2]

И в качестве бонуса также суммируется до:

[NaN, 3, 2]

, содержащее только максимальные длины всех последовательных вхождений значений False после Истинное значение.

Заранее большое спасибо

draj

Ответы [ 4 ]

3 голосов
/ 03 марта 2020

Если вы хотите работать только с сериями, вы можете адаптировать ответ @ kiki следующим образом:

s = pd.Series([False, True, False, False, False, True, False, False])
(s.groupby(s.cumsum()).count()-1).replace(0,np.nan).tolist()

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

Выход:

[nan, 3.0, 2.0]

Кроме того, для всей серии это просто:

(s.groupby(s.cumsum()).cumcount())

Выход 2:

0    0
1    0
2    1
3    2
4    3
5    0
6    1
7    2

Пожалуйста скажите, если в первом ряду проблема с нулем вместо nan.

3 голосов
/ 03 марта 2020

Попробуйте это

out = (~A).cumsum() - (~A).cumsum().where(A).ffill()

Out[1372]:
0    NaN
1    0.0
2    1.0
3    2.0
4    3.0
5    0.0
6    1.0
7    2.0
dtype: float64

Если вы хотите получить сумму, попробуйте это с out выше

out_sum = out[A.shift(-1, fill_value=True) & out.ne(0)]

Out[1411]:
0    NaN
4    3.0
7    2.0
dtype: float64
1 голос
/ 03 марта 2020

Адаптация ответа @Andy L на фрейм данных:

df = pd.DataFrame({'values':[False, True, False, False, False, True, False, False]})

df['cumsum'] = (~df['values']).cumsum() - (~df['values']).cumsum().where(df['values']).ffill()
grouped = pd.concat([df.loc[df[df['values']==True].index-1,:],df.tail(1)])

Вывод:

    values  cumsum
0    False     NaN
1     True     0.0
2    False     1.0
3    False     2.0
4    False     3.0
5     True     0.0
6    False     1.0
7    False     2.0

Сгруппированный вывод:

    values  cumsum
0    False     NaN
4    False     3.0
7    False     2.0
1 голос
/ 03 марта 2020

Я думаю, что функция cumsum может помочь вам создать своего рода идентификатор в каждом истинном появлении. Тогда вы сможете группировать и делать то, что вам нужно

res = pd.DataFrame([False, True, False, False, False, True, False, False],columns=['val'])
res['cumsum'] = res.val.cumsum()
res.groupby("cumsum").count() - 1

Вывод:

      val  
cumsum
0       0       
1       3       
2       2       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...