2014-10-09 2 views
0

이 질문이 전에 제기되었는지 확실하지 않습니다. 팬더 dataframe에서 난 Z는 B 및 2.5 2 B 및 C에 대해 0에서 간 (제 1 표의) 위의 예에서다른 열의 조건에 따라 그룹에서 팬더 데이터 프레임 최대 값이

A B C 

1 z 2 2.5 
2 y 1 1 
3 z 2 0.8 

얻을하고자

A B C 

1 z 0 0 
2 z 1 1 
3 z 2 2 
4 y 0 0 
5 y 1 1 
6 z 2 2.5 
7 z 0 0 
8 z 1 0.2 
9 z 2 0.8 

같은 데이터를 가지고 B와 C에 대해 0이되기 전에 각각 C와 C가 다를 수 있지만 동시에 0으로 갈 것입니다. 그것을 카운터라고 생각하면 장치가 꺼져있을 때 모든 카운터는 0으로 되돌아갑니다. 위 예제의 장치는 y와 z입니다.

또한 첫 번째 표에서 y는 B와 C 모두 0에서 1로 갔지만 0으로 되돌아 가지는 않았지만 여전히 최대 값은 B와 C의 경우 1과 1이 필요합니다.

루프를 통해 파이썬 코드를 작성하고 필요한 변환 작업을 수행 할 수 있지만 일부 팬더 마술에서는 이것이 가능한지 궁금합니다.

답변

1

다음은 벡터화 된 방법을 사용하는 방식입니다. 매우 신속해야합니다.

A는 모두 B & C는

0

df['new_sample'] = (df[['B','C']] == 0).any(1).astype(int) 
이어서 어디 확인하여, 카운터가 "리셋"될 때 값 1로 열을 추가 장치 유형 GROUPBY 및 누적 금액을 이용하여 new_sample 열에서 각 행이 나타내는 각 장치의 평가판에 대한 카운터를 만듭니다.

df['sample'] = df.groupby('A')['new_sample'].cumsum() 

마지막으로 장치와 샘플 번호로 그룹화하고 최대 값을 지정할 수 있습니다.

In [85]: df.groupby(['A', 'sample'], as_index=False)[['B','C']].max() 
Out[85]: 
    A sample B C 
0 y  1 1 1.0 
1 z  1 2 2.5 
2 z  2 2 0.8 
관련 문제