2017-01-14 3 views
2

이 질문은 내가 게시 한 이전 질문의 속편입니다 : Slicing Pandas Dataframe according to number of lines. 나는 문제를 해결 한 좋은 해답을 가지고있다. 그럼에도 불구하고 솔루션을 다른 방법으로 시도 할 때 기대했던 것을 얻지 못하고 많은 테스트에도 불구하고 이유를 이해하지 못합니다.도청 된 DataFrame 슬라이싱?

'Group'Id (한 그룹에 많은 오브젝트가있을 수 있음)와 수량 (예 : 'R')이 포함 된 pandas 데이터 프레임 df가 있다고 가정합니다. 나는 적어도 4 개의 객체로 구성된 그룹을 가지고 다른 df를 만들고 싶습니다. 그리고 R에 의해 정렬 될 때 4 번째 객체는 R_min보다 낮습니다 (나는 'R_min'을 최대로 호출하는 것이 이상하다는 것을 알지만, 은하의 크기입니다. 음수, 밝음이 낮을수록 - 또는 절대 값이 클수록 밝아짐).

R_min = -18.8 
df_processed = (df[df.Group.map(df.Group.value_counts().ge(4))] 
    .groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] <= R_min))) 

enter image description here

I : 내 문제에 대한 해결책이 완벽하게 작동하는 것 같다이 하나입니다

df = pd.DataFrame({ 'R'  : (-21,-21,-22,-3,-23,-24,-20,-19,-34,-35,-30,-5,-25,-6,-7,-22,-21,-10,-11,-12,-13,-14,-15), 
    ....:   'Group': (1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5) }) 

df

: 여기에 문제를 위해 구성된 모의 DataFrame이다 동의합니다. 제 3 그룹 만 제 제약하에 남아 있습니다. 확인을하고 내 은하 그룹 카탈로그가 어떻게 구조화되었는지 알기 위해 최소한 4 인의 회원을 보유한 사람들 중에서 무엇이 남았는지 확인합니다. 나는 다음과 같은 코드가 정확히 같은 일을 기대 :

df_left = (df[df.Group.map(df.Group.value_counts().ge(4))] 
     .groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] > R_min))) 

불행하게도 그렇지 않습니다 :

enter image description here

가장 stricking 포인트는 여기에있는 해당 그룹 3 df_left도입니다! R로 분류하면 그룹 3은 -35, -34, -30, -19, -5가되며 그 중 네 번째 값은 -19이며 -18.8보다 작습니다. 어째서? 선택 방법이 잘못 되었습니까? 어떻게 수정해야합니까? x.sort_values('R').iloc[3]이 DataFrame뿐 아니라 열 R로 구성된 시리즈 정렬되어 있기 때문에

많은 감사

+1

링크 된 게시물에 대한 답변이 나에게 나올 것입니다. 지금 당신이 지적한 바에는 약간의 오류가있었습니다. 필요한 변경 사항이있는 게시물을 업데이트했습니다. –

+1

쿨, 고마워! :) – Matt

답변

1

는이 오류를 받고 있습니다. 즉, np.any을 호출하면 열 Group을 포함하여 열이 있는지 확인하여 R_min보다 큰지 확인하고 모든 값이 Group에 대해 양수이므로 true를 반환합니다.

코드 또한 매우 차선입니다. 대신이 작업을 수행해야합니다.

R_min = -18.8 
df.groupby('Group').filter(lambda x: (x.shape[0] >= 4) & (x['R'].nsmallest(4).iloc[-1] <= R_min)) 
+0

완벽한! 고마워요! 실제 갤럭시 그룹 카탈로그에는 많은 필드가 있으므로 내 선택이 잘못되었다는 것을 의미합니다. 코드가 완벽하게 작동하고 이전보다 훨씬 쉽게 읽을 수 있습니다. 다시 감사합니다! – Matt

+0

또한, 귀하의 설명은 매우 명확합니다. :) – Matt