Новая переменная в фрейме данных panda, которая считает последовательные значения - PullRequest
3 голосов
/ 18 апреля 2019

У меня есть panda dataframe (который импортируется из excel), состоит из 2 переменных, f это просто число, другое - логическое значение, если число выходит за пределы диапазона

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

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

Конечный фрейм данных должен выглядеть примерно так

f   outrange  count
1    F       0
2    F       0 
3    T       1
4    T       2
1    F       0
3    T       1
2    F       0
3    T       1  
4    T       2

Я очень плохо знаком с Python, поэтому извините, если вопрос не сформулирован правильно

Ответы [ 3 ]

4 голосов
/ 18 апреля 2019

Используйте векторизованное решение с заменой T значения:

a = df['outrange'] == 'T'
#if values are boolean True
#a = df['outrange']
b = a.cumsum()
df['count_new'] = b-b.where(~a).ffill().fillna(0).astype(int)
print (df)
   f outrange  count  count_new
0  1        F      0          0
1  2        F      0          0
2  3        T      1          1
3  4        T      2          2
4  1        F      0          0
5  3        T      1          1
6  2        F      0          0
7  3        T      1          1
8  4        T      2          2

Производительность :

#90k
df = pd.concat([df] * 10000, ignore_index=True)

In [183]: %%timeit
     ...: a = df['outrange'] == 'T'
     ...: b = a.cumsum()
     ...: df['count_new'] = b-b.where(~a).ffill().fillna(0).astype(int)
     ...: 
7.83 ms ± 28.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [184]: %%timeit
     ...: df['B'] = df['outrange'].apply(conditional_cumulative_sum)
     ...: 
35.9 ms ± 295 µs p
1 голос
/ 18 апреля 2019

Я использовал свои собственные данные в качестве входных данных.Столбец «А» соответствует вашему столбцу «outrange», а «B» соответствует столбцу «count».Пожалуйста, проверьте ваши фактические данные.

import numpy as np 
import pandas as pd

df = pd.DataFrame(data{'A':['F','T','T','T','F','F','F','T','F','F','F','T','T','F','F','F']})
counter = 0

def conditional_cumulative_sum(x):
    global counter

    if x == 'F':
        counter = 0
        return counter
    elif x == 'T':
        counter += 1
        return counter
df['B'] = df['A'].apply(conditional_cumulative_sum)
0 голосов
/ 18 апреля 2019

Возможно, легче со словарем.

arr = np.array([0,0,1,1,0,1,0,1,1]) #your array of booleans

dct = {k:0 if arr[k]<1 else 1 for k in range(len(arr))}

c = 0
for i in arr:
  if i > 0 and dct[c-1]>0:
     dct[c] = 1 + dct[c-1]
  c = c+1

pd.DataFrame([arr,dct.values()],index=["outofrange","count"]).T

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