我有一个熊猫数据框(从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还是很陌生,如果问题的措词不正确
答案 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