2017-11-28 1 views
1

에 뒤로 찾고 찾기 :나는 다음과 같은 dataframe이 값의 첫 번째 인스턴스가 팬더 dataframe

내가 상향보고, 마지막 값, 7의 첫 번째 인스턴스를 반환 뭔가를 쓰고 싶어
Timestamp Value 
11/23/2017 7 
11/24/2017 3 
11/25/2017 5 
11/26/2017 7 
11/27/2017 7 
11/28/2017 7 

, 값이 다른 것으로 변경되면 중지됩니다. 따라서 샘플 데이터 프레임에 대한 대답은 11/26/2017이어야합니다.

나는 drop_duplicates을 시도했지만 타임 스탬프가 11/23/2017 인 첫 번째 행을 반환합니다.

감사합니다.

답변

2

loc에 의해 idxmax과 마지막 선택 값으로 최대 값의 인덱스를 얻을, 열 Value의 독특한 연속 값을 얻기위한 도우미 Series 만들기 :

print (df) 
    Timestamp Value 
0 11/23/2017  7 
1 11/24/2017  3 
2 11/25/2017  5 
3 11/26/2017  7 
4 11/27/2017  7 
5 11/28/2017  7 

a = df['Value'].ne(df['Value'].shift()).cumsum() 
b = df.loc[a.idxmax(), 'Timestamp'] 
print (b) 
11/26/2017 

세부 사항 :

print (a) 
0 1 
1 2 
2 3 
3 4 
4 4 
5 4 
Name: Value, dtype: int32 

하는 경우 첫 번째 열은 인덱스 값이 max 인 인덱스 값이이므로 인덱스 솔루션이 더 간단합니다.: 600.000 행 DF에 대한

print (df) 
      Value 
Timestamp   
11/23/2017  7 
11/24/2017  3 
11/25/2017  5 
11/26/2017  7 
11/27/2017  7 
11/28/2017  7 

b = df['Value'].ne(df['Value'].shift()).cumsum().idxmax() 
print (b) 
11/26/2017 
+1

속도 ;-) 테스트를 위해 – MaxU

+0

감사를 비교하는 흥미로운 일이 될 것입니다! 난 그냥 600.000 행 DF에 대해 그것을 테스트 - 내 솔루션이 조금 더 빨랐어 ... ;-) – MaxU

+0

'4ms'?) – jezrael

2
In [173]: df.iat[df.loc[::-1, 'Value'].diff().fillna(0).ne(0).idxmax()+1, 
       df.columns.get_loc('Timestamp')] 
Out[173]: '11/26/2017' 

타이밍 :

In [201]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [202]: %%timeit 
    ...: df['Value'].ne(df['Value'].shift()).cumsum().idxmax() 
    ...: 
15.3 ms ± 646 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

In [203]: %%timeit 
    ...: df.iat[df.loc[::-1, 'Value'].diff().fillna(0).ne(0).idxmax()+1, 
    ...:  df.columns.get_loc('Timestamp')] 
    ...: 
11.6 ms ± 237 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 
관련 문제