내 질문의 기본 작업은 다소 사소한 것이며 분명히 많은 방법이 있습니다. 그러나 질문의 핵심 부분은 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'),
)
)
이것은 나에게 원하는 출력을 제공하지만 람다를 중첩하는 방식은 이상하고 복잡해 보입니다. 인터넷 검색을하고 여기를 살펴본 후에는 메서드 체인의 제약 내에서 더 나은 방법을 찾을 수 없습니다.
어떤 아이디어?
우리는 사용할 수 있습니다 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] 삭제
몇 마디 만하겠습니다