这是我的DataFrame:
max hits
0 NaN NaN
1 NaN NaN
2 NaN True (bad)
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 True NaN
7 NaN True (good)
8 NaN NaN
9 NaN NaN
10 NaN True (good)
11 True NaN
12 NaN NaN
13 NaN NaN
我想计算"hits"列中有多少True值与"max"列中的True值接近。接近标准是向上两步和向下两步。所以在我的例子中,答案是2。
现在我这样数:
# get indexes of True values in hits column
indexes = df.dropna(subset = ['hits']).index
count = 0
for index in indexes:
df_slice = df_work.iloc [index-2 : index+2+1].dropna(subset = ['max'])
if len(df_slice) > 0:
count += 1 # True in 'hits' is close to True value in 'max'
它按预期工作,但非常缓慢。我的DataFrame非常大,我松了很多次。有更快的路吗?
更新时间:它开始使用这种方法飞行:
df.hits.fillna(method='bfill', inplace=True, limit=2)
df.hits.fillna(method='ffill', inplace=True, limit=2)
count = len (df.dropna(subset=['hits', 'max'], inplace=False, how = 'any'))
让我们试试bfill/ffill
和limit
:
(df.hits.bfill(limit=2).ffill(limit=2) & df['max']).sum()
# out 2
#引入一个测试列
df=df.assign(test=df.sum(1).replace(0, np.nan).fillna(method='ffill',limit=2))
#Create Condition and Choices
cond=[df.hits.notna()&df['test'].ne(df['test'].shift(3)),df.hits.notna()&df['test'].eq(df['test'].shift(3))]
choices=['bad','good']
#Update staus using np.where
df['status']=np.select(cond,choices,'')
print(df)
max hits test status
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN True 1.0 bad
3 NaN NaN 1.0
4 NaN NaN 1.0
5 NaN NaN NaN
6 True NaN 1.0
7 NaN True 1.0 good
8 NaN NaN 1.0
9 NaN NaN 1.0
10 NaN True 1.0 good
11 True NaN 1.0
12 NaN NaN 1.0
13 NaN NaN 1.0