2017-10-21 1 views
0

주어진 행의 숫자 시퀀스에 따라 숫자의 데이터 프레임을 코딩하고 싶습니다. 숫자의 순서 자체는 내가 포착하고 싶은 의미를 가지고 있습니다. 루프를 사용하여이 문제를 해결할 수 있었지만 시간이 많이 걸렸습니다.반복없이 적용을 사용하여 pandas 데이터 프레임에 코드 할당

시작 DF는 :

2017-10-06 2017-10-07 2017-10-08 
id                 
1   1.0  46.0   5.0 
2  16.0   1.0   0.0 
3  23.0  123.0   0.0 
4   1.0   0.0   0.0 
5   0.0   0.0   0.0 

나는 각 열을 전달하는 기능을 만들었습니다. 이전 열에 대한 지식이 필요하며 코딩 문자열을 할당합니다.

부호화 DF 보이는 같은 :

2017-10-06 2017-10-07 2017-10-08 
id                 
1  active  active  active 
2  active  active inactive_1 
3  active  active inactive_1 
4  active inactive_1 inactive_1 
5 inactive_1 inactive_1 inactive_3 
나는 현재 할당 한 번 각 열을 반복 할 수 있어요

'활성'다음 제로의 수를 지정 (제로가 아닌 값을보기 쉬운) (제로가 발견되면 마지막 값이 '활성'이 아닌,

for i in range(1, len(cols)): 
    test = cols[i] 
    prev = cols[i-1] 
    df[cols[i]] = df.apply(lambda row: assign_active(row[prev], row[test]), axis=1) 

중간 DF가 보이는 1의 경우 시작)에서, 이전 값을보고 일을 추가 같은 :

2017-10-06 2017-10-07 2017-10-08 
id                 
1  active  active  active 
2  active  active   1 
3  active  active   1 
4  active   1   2 
5   1   2   3 

다시 반복하고 '활성'이 아닌 항목은 각 열을 반복하는 것과 동일한 방법으로 코드를 적절히 코딩하고 내 함수로 apply를 사용합니다. 이 함수는 특정 값을보고 올바른 코드를 할당합니다 (문자열을 조작하는 것뿐만 아니라 'active_2'도 없음을 알 수 있습니다)

반복하지 않고이 작업을 수행하는 방법을 찾고 싶습니다. 전혀 각 열을 통해 두 번 혼자.

감사합니다.

답변

1

IIUC는 np.where을 사용하는 함수를 정의합니다 (매우 빠름에 유의하십시오).

def foo(s): 
    return np.where(s > 0, 'active', 'inactive_' + (s.eq(0).cumsum()).astype(str)) 

이제 첫 번째 축을 따라 df.apply을 호출하십시오.

df = df.apply(foo, 1) 
print(df) 
    2017-10-06 2017-10-07 2017-10-08 
id          
1  active  active  active 
2  active  active inactive_1 
3  active  active inactive_1 
4  active inactive_1 inactive_2 
5 inactive_1 inactive_2 inactive_3 

중간 출력이 주어지면 원하는 내용 일 것입니다.

+0

coldspeed - 설명대로 문제가 해결되었습니다 - 감사합니다! 내 문제가 변경되었으므로 다른 값이 표시된 후에 다시 cumsum을 재설정해야합니다. 예를 들어 [5, '2017-10-07']의 값이 시작 df에서 1이면 출력 df의 맨 아래 행은 [inactive_1, active, inactive_1]이어야합니다. – Matt

관련 문제