>source

이것은 내 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

'적중'열의 True 값이 '최대'열의 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은 매우 크고 많은 시간을 잃었습니다. 더 빠른 방법이 있습니까?

  • 답변 # 1

    해보자 bfill/ffilllimit :

    (df.hits.bfill(limit=2).ffill(limit=2) & df['max']).sum()
    # out 2
    
    

  • 답변 # 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  
    
    
    

관련 자료

  • 이전 javascript - GET ajax 호출이 오류 코드 500을 반환하는 이유는 무엇입니까?
  • 다음 javascript - div에 추가하려고 할 때 Aspnet MVC 응용 프로그램이 로그인으로 리디렉션됩니다