使用panda确定两列中的值是否彼此接近



这是我的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/ffilllimit:

(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  

最新更新