Pandas 메서드 체인 식 내에서 다른 열의 값을 기반으로 데이터 하위 집합의 값을 바꾸는 방법

에르난도 카사스

내 질문의 기본 작업은 다소 사소한 것이며 분명히 많은 방법이 있습니다. 그러나 질문의 ​​핵심 부분은 Pandas 메서드 체인 식을 사용하여 수행하는 방법입니다. 가장 관용적 인 방법은 무엇입니까?

이 재현 가능한 예를 고려하십시오.

df = pd.DataFrame({'class_size':[1,2,3,4,5,6,7,8,9,10],
                   'num_classes':[100,80,50,40,38,2,1,1,0,0]})

이제 class_size가 5보다 큰 모든 행을 함께 그룹화하려고합니다. 그 지점을 넘어서는 num_classes것은 매우 작기 때문입니다.

클래스 크기에 따라 새 열을 빠르게 만든 다음 5보다 큰 값을 다른 것으로 바꿀 수 있습니다.

df['grp'] = df.class_size
df.loc[df.class_size > 5, 'grp'] = '> 5'
df

class_size  num_classes grp
0   1   100 1
1   2   80  2
2   3   50  3
3   4   20  4
4   5   10  5
5   6   2   > 5
6   7   1   > 5
7   8   1   > 5
8   9   0   > 5
9   10  0   > 5

좋아, 그것은 원하는 결과입니다 (내가 말했듯이 사소한). 그런 다음 나중에 새 df를 사용하여 예를 들어 요약 테이블을 생성 할 수 있습니다.

df.groupby('grp').agg(
    class_sizes_nunique = ('class_size', 'nunique'), 
    num_classes = ('num_classes', 'sum'),
)

class_sizes_nunique num_classes
grp     
1   1   100
2   1   80
3   1   50
4   1   20
5   1   10
> 5 5   4

자, 이것을 달성하는 가장 좋은 방법은 무엇입니까?하지만 Pandas 메서드 체인 식 내에서? 같은 것

(
    df.
    replace_values_in_subset().
    to_other_stuff().
    …
)

내 생각에이 제약 조건 .loc[]은 전체 데이터 프레임을 나중에 사용 하기를 원하기 때문에.

그래서 나는 assign()시도했다.

"시리즈의 진실 값이 모호합니다"라는 오류로 인해 첫 번째 시도가 작동하지 않았습니다.

(
    df.
    assign(grp = lambda x: x.class_size if x.class_size > 5 else x.class_size).
    groupby('grp').agg(
        class_sizes_nunique = ('class_size', 'nunique'), 
        num_classes = ('num_classes', 'sum'),
    )
)

그런 다음 .NET assign()결합 하여 원하는 결과를 얻을 수있었습니다 apply().

(
    df.
    assign(grp = lambda x: x.class_size.apply(lambda y: '> 5' if y > 5 else y)).
    groupby('grp').agg(
        class_sizes_nunique = ('class_size', 'nunique'), 
        num_classes = ('num_classes', 'sum'),
    )
)

이것은 나에게 원하는 출력을 제공하지만 람다를 중첩하는 방식은 이상하고 복잡해 보입니다. 인터넷 검색을하고 여기를 살펴본 후에는 메서드 체인의 제약 내에서 더 나은 방법을 찾을 수 없습니다.

어떤 아이디어?

Ansev

우리는 사용할 수 있습니다 Series.mask:

new_df = (df.assign(grp = df['class_size'].mask(df['class_size'].gt(5),'>5'))
            .groupby('grp').agg(class_sizes_nunique = ('class_size', 'nunique'), 
                                num_classes = ('num_classes', 'sum')
                               )
         )
print(new_df)

산출

     class_sizes_nunique  num_classes
grp                                  
1                      1          100
2                      1           80
3                      1           50
4                      1           40
5                      1           38
>5                     5            4

다음을 사용할 수도 있습니다 Series.where.

df.assign(grp = df['class_size'].where(df['class_size'].le(5),'>5'))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관