我有一个熊猫数据(从excel导入),由两个变量组成,f只是一个数字,另一个是布尔值,如果这个数字超出了范围。
我想要创建一个新的变量来计算连续的真实值。
我在网上读了一些,我认为这个新变量可以使用连续计数,但我不知道如何将它实现到这个dataframe。
最后的dataframe应该如下所示
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非常陌生,如果这个问题的措辞不正确,我很抱歉。
发布于 2019-04-18 01:18:13
我使用了自己的数据作为输入。列'A‘对应于'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)
发布于 2019-04-18 01:27:46
使用矢量化解决方案替换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
发布于 2019-04-18 02:04:34
也许用字典比较容易。
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
https://stackoverflow.com/questions/55742177
复制相似问题