2014-11-13 2 views
1

일주일에 1을 초과하여 비 순차적이되면 groupby에서 데이터를 제거하려고합니다. 예 : If 일주일에 간격이 있으면 해당 행과 그 행의 후속 행을 제거하고 싶습니다. 아래는 내가 가지고있는 데이터의 구조와 내가 찾고있는 이상적인 결과의 간단한 예제이다. 데이터는 국가 및 제품별로 그룹화해야합니다. 주 5 위의 주 또한 DE 애플을 제거이 3 주이기 때문에 앞의 주 주 5 & 6 제거 DE 애플 4. 때문에 Python Pandas : groupby의 이전 행에있는 값이 특정 조건을 충족하는 경우 데이터 프레임에서 행 제거

import pandas as pd 

data = {'Country' : ['US','US','US','US','US','DE','DE','DE','DE','DE'],'Product' :   ['Coke','Coke','Coke','Coke','Coke','Apple','Apple','Apple','Apple','Apple'],'Week' : [1,2,3,4,6,1,2,3,5,6] } 

df = pd.DataFrame(data) 

print df 

#Current starting Dataframe. 
    Country Product Week 
0  US Coke  1 
1  US Coke  2 
2  US Coke  3 
3  US Coke  4 
4  US Coke  6 
5  DE Apple  1 
6  DE Apple  2 
7  DE Apple  3 
8  DE Apple  5 
9  DE Apple  6 

#Ideal Output below: 
    Country Product Week 
0  US Coke  1 
1  US Coke  2 
2  US Coke  3 
3  US Coke  4 
5  DE Apple  1 
6  DE Apple  2 
7  DE Apple  3 

그래서 출력은 미국 콜라를 위해 6 주를 제거 그 5 또는 1

답변

1

의 DIFF()되어 이전이

df.groupby(['Country', 'Product']).apply(lambda sdf: sdf[(sdf.Week.diff(1).fillna(1) != 1).astype('int').cumsum() == 0]).reset_index(drop=True) 

또 다른 방법을 작동해야에도 불구하고 6 주, 즉 즉 주 연속 세트를 생성하고 체크 대상 (더 읽을 수 있습니다 관측하다 에드 주)

df['expected_week'] = df.groupby(['Country', 'Product']).Week.transform(lambda s: range(s.min(), s.min() + s.size)) 
df[df.Week == df.expected_week] 
+0

덕분에, 그것은 미국 콜라 6, DE 애플 5. 그러나 DE 애플 6 개 유적을 떨어 뜨리고 일했다. – IcemanBerlin

+0

당신 말이 맞아요. 나는 그것을 지금 고쳤다 – user1827356

+0

첫 번째 작품은 고맙지 만, .cumsum() == 1을 .cumsum()! = 1]로 변경하면 반대가된다.) 완벽하다. 두 번째로 논리를 좋아해서 추가 열을 추가하는 것을 더 쉽게 이해할 수 있지만 이상한 오류 메시지가 나타납니다. "TypeError : 입력 된 열의 프레임 인덱스와 호환되지 않는 색인"모든 입력에 대해 감사드립니다. – IcemanBerlin

1

당신은이 방법을 시도해 볼 수도 있습니다 ...

def eliminate(x): 
    x['g'] = x['Week'] - np.arange(x.shape[0]) 
    x = x[x['g'] == x['g'].min()] 
    x = x.drop('g',1) 

    return x 

out = df.groupby('Product').apply(eliminate).reset_index(level=0,drop=True) 
+0

고마워요 @ ZJS, 이것은 람다 대신에 함수를 사용하는 좋은 견해를 보여줍니다. 램다는 여전히 저를 혼란스럽게합니다. 내가 당신의 코드를 돌렸을 때, 콜크 주 4를 드롭해야 할 것 같았던 점을 제외하고는 좋았습니다. – IcemanBerlin

관련 문제