2014-10-08 4 views
0

데이터 프레임을 그룹으로 나눠야하고 홀수 라인이있는 그룹의 경우 특정 조건과 일치하는 첫 번째 라인을 가져와야합니다. 첫 번째 줄을 모으려면 (조건에 맞는 홀수 번째 그룹의 첫 번째 줄만). 나는 아래처럼 루프에서 그것을 할 수있다. (작동한다.) apply와 함께 groupby에 그것을 다시 고칠 수는 없다. 도와 드릴까요?팬더의 데이터 프레임 그룹 반복을 groupby로 변환하여 적용

grp_by_cols=['A','B'] 
new_df=pd.DataFrame(columns=grp_by_cols) 
for name, group in txn.groupby(grp_by_cols): 
if len(group) % 2 != 0: 
    new_df=new_df.append(group[group['C']=='something')].head(1)) 

답변

2

다음은 적용 할 함수를 작성하여 해결할 수있는 흥미로운 문제입니다. 키가이 그룹에 의지 열 및 '데이터 1을'이다

import pandas as pd 
import random 

DF = pd.DataFrame({ 
     'key' : [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7], 
     'data1' : ['A', 'B', 'C', 'A', 'B', 'B', 'B', 'C', 'A', 'B', 'A', 'B', 'C', 
       'A', 'B', 'B', 'B', 'C'], 
     'data2' : [random.random() for x in xrange(18)]}) 

당신이를 테스트하는 데 사용할 열이

:

는이 같은 데이터 (질문과 편리했을 것이다) 한 가정 조건. 이 데이터는 그룹 1, 3, 5 및 7에 대한 관측치가 홀수입니다. 첫 번째 관측에서 이들 그룹에 대한 'data1'값은 'A', 'B', A ','B '입니다.

def apply_func(df, col, condition): 
    if len(df)%2 == 0: 
     return None 
    else: 
     if df.irow(0)[col] == condition: 
      return df.irow(0) 
     else: 
      return None 
: 당신이 그 그룹에서 처음 관찰로 새로운 dataframe을 얻고 싶었다,하지만 첫 번째 행의 '데이터 1'값이 B. 동일입니다 우리는이 같은 일반적인 함수를 작성할 수 있습니다 예를 들어 가정 내가 잘못 아니에요 경우 생성 할 출력 유형이

data1  data2 key 
2  B 0.980814 3 
6  B 0.428402 7 

: 다음과 같은 출력을 제공

DF.groupby('key').apply(apply_func, 'data1', 'B').dropna() 

을 다음과 같이

한 다음 그룹에 문의하십시오.

물론 실제로 함수의 모든 분기가 필요하지는 않지만 명확하게하기 위해 포함합니다. 기능을 작성하는 가장 간결한 방법은 다음과 같습니다 적용하는 함수를 통과 호출 할 때, 전달 된 주먹 인수가 DataFrame 자체이며,이 때문에 자동으로 수행됩니다

def apply_func(df, col, condition): 
    if len(df)%2 != 0 and df.irow(0)[col] == condition: 
     return df.irow(0) 

하는 것으로. 그래서 함수를 전달할 때 'df'인수를 지정할 필요가 없습니다. 사실 당신이 그렇게한다면 당신은 너무 많은 주장들을 지나쳤다는 오류를 얻습니다. 또한 다소 이상하게 내보기에서 함수를 전달할 때 인수는 괄호 대신 쉼표 다음에 제공됩니다. 이것은 내가보기에 혼란 스럽지만, 그것이 무엇인지 알 것입니다 ....

+0

Canonical! 감사합니다 – Lamakaha

관련 문제