熊猫数据框中的新变量可计算连续值

时间:2019-04-18 08:37:32

标签: python pandas 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 个答案:

答案 0 :(得分:4)

使用向量化解决方案替换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 :(得分:1)

我已使用自己的数据作为输入。列“ A”对应于“范围”列,而列“ B”对应于“计数”列。请测试您的实际数据。

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)

答案 2 :(得分:0)

使用字典可能更容易。

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