2017-10-29 7 views
2

전원 시스템의 시계열 데이터를 분석 중이며 특정 임계 값을 초과하는 인접한 데이터 요소를 찾으려고합니다.pandas groupby 함수 결과에 따른 데이터

저는 현재 수식을 행별로 수동으로 행을 사용하고 있지만이 방법은 파이썬 판다 그룹웨어 기능에서 수행 할 수 있음을 깨달은보다 효율적인 방법을 찾고 있습니다.

그러나 읽은 예제에서 groupby 함수는 동일한 레이블을 가진 경우에만 행을 그룹화합니다. 내가 원하는 것은 value => 3인지를 확인할 수있는 groupby에 특정 함수를 전달한 다음 임계 값 => 3을 위반 한 시작 및 종료 시간으로 인덱싱 된 값을 그룹화하는 것입니다.

입력 :

+-------+---------+------+ 
| Index | Time | Value| 
+-------+---------+------+ 
|  0 | 00:00:01| 3 | 
|  1 | 00:00:02| 4 | 
|  2 | 00:00:03| 5 | 
|  3 | 00:00:04| 2 | 
|  4 | 00:00:05| 6 | 
|  5 | 00:00:06| 7 | 
|  6 | 00:00:07| 1 | 
|  7 | 00:00:08| 9 | 
+-------+---------+------+ 

출력 :

+-------+-----------+----------+--------+ 
| Index | TimeStart | TimeEnd | Value | 
+-------+-----------+----------+--------+ 
|  0 | 00:00:01 | 00:00:03 | 3,4,5 | 
|  1 | 00:00:05 | 00:00:06 | 6,7 | 
|  2 | 00:00:08 | 00:00:08 | 9  | 
+-------+-----------+----------+--------+ 

답변

2
  • 마스크를 만들 경우 CRE 미만 3
  • 누적 합계
  • 컬럼을

mask = df.Value.lt(3) 
grp = mask.cumsum() 

d1 = df[~mask].groupby(grp[~mask]).agg(dict(
    Time=['first', 'last'], 
    Value=lambda x: ','.join(map(str, x)) 
)) 

d1.columns = ['TimeStart', 'TimeEnd', 'Value'] 

d1 

     TimeStart TimeEnd Value 
Value       
0  00:00:01 00:00:03 3,4,5 
1  00:00:05 00:00:06 6,7 
2  00:00:08 00:00:08  9 
+0

선생님이 이름 바꾸기 크거나 다음 3

  • 필터 마스크에 의해 df, groupby
  • 사용 agg 동일하면 여러 기능을 전달하기보다는 그룹을 먹었다 나는 그것이 더 많은 표를 얻길 바란다. – Dark

  • +0

    와우, 정말 고마워! 나는 당신이 cumsum과 마스크와 같은 함수를 사용하고 있다는 것을 알지 못한다. 이것은 파이썬에 관한 나의 현재 지식에서 벗어난 것이다. 이것들을 깊이 파고들 것입니다. 다시 감사합니다. –