pandas 그룹by 그룹 대상의 그룹 내 정렬 솔루션
질문:
데이터 열에 따라 그룹을 나누고 다른 열 크기 top-K의 줄 데이터를 선택하십시오
확인:
풀이 방향이 뚜렷하다. 즉, 먼저 그룹by로 데이터를 그룹화한 다음에 그룹화된 후의 어떤 열에 따라 정렬하고 정렬 결과의 top-K 결과를 선택한다.
사례:
Dataframe에서 B열 각 객체에서 C 값이 가장 높은 행을 찾습니다.
df = pd.DataFrame({"A": [2, 3, 5, 4], "B": ['a', 'b', 'b', 'a'], "C": [200801, 200902, 200704, 201003]})
Groupby의 기본 기능 소개Groupby 이후 DataFrameGroupBy 객체로 돌아갑니다. 실제로는 아무런 계산도 하지 않고 잠시 저장된 용기입니다.
[In]df.groupby('B')
[Out]<pandas.core.groupby.DataFrameGroupBy object at 0x11800f588>
Groupby 결과에 대한 간단한 열 선택을 통해 DataFrameGroupBy/SeriesGroupBy 객체를 반환합니다. 시각화할 수 없습니다.
[In]df.groupby('B')['A'] # SeriesGroupBy
[Out]<pandas.core.groupby.SeriesGroupBy object at 0x117f6b630>
[In]df.groupby('B')['A','C'] # DataFrameGroupBy
[Out]<pandas.core.groupby.DataFrameGroupBy object at 0x117fb84e0>
DataFrameGroupBy에 대해 계수, 통계,agg 집합 계산, apply 맵 계산과transform 등의 조작을 해야만 시각화된 데이터를 생성할 수 있습니다 (다음은count와size 함수만 예로 보여 주고 다른 조작은 언급하지 않음)
[In] df.groupby('B', as_index=False)['A'].count() #
[Out] B A
0 a 2
1 b 2
[In] df.groupby('B')['A'].size().reset_index(name='Size') # ,size count count Nan,size Nan
[Out] B Size
0 a 2
1 b 2
솔루션 1:
DataFrameGroupBy 객체에 대해 apply 함수로 열의sort_values 정렬, 그 중 최대 값을 선택하십시오.
# multiindex dataframe , level=0 groupby by , level=1 index
[In] df.groupby('B').apply(lambda x: x.sort_values('C', ascending=False))
[Out] A B C
B
a 3 4 a 201003
0 2 a 200801
b 1 3 b 200902
2 5 b 200704
# group_keys multiindex
[In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False))
[Out] A B C
3 4 a 201003
0 2 a 200801
1 3 b 200902
2 5 b 200704
# groupby, first() ,
[In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False)).groupby('B').first().reset_index()
[Out] B A C
0 a 4 201003
1 b 3 200902
솔루션 2:
일단 B를 전체적으로sort_values, 그룹에서 값 얻기
[In] df.sort_values('C', ascending=False).groupby('B').first().reset_index()
[Out] B A C
0 a 4 201003
1 b 3 200902
질문 확장:
지금까지 Top-1 문제만 해결했는데 Top-k라면?
답안:first () 함수를head () 함수로 변경
[In] df.sort_values('C', ascending=False).groupby('B').head(2)
[Out] A B C
3 4 a 201003
1 3 b 200902
0 2 a 200801
2 5 b 200704
요약:
1. 방안 2, 즉 먼저 정렬하고 그룹by로 값을 얻는 것이 더욱 편리하다
2. pandas에는 API가 매우 많기 때문에 실제 사용할 때 각 단계의 반환값 유형을 훑어보고 기억과 연상을 편리하게 해야 한다
추가:pandas 그룹 그룹by,agg,정렬sort,concat,join 연결
concat과join 연결
수평 연결
pd.concat([df6,df7],axis=1)
df6.join(df7)
# df6 , df7
참고 사항:1. concat 이 방법은 가로 연결도 할 수 있고 세로 연결도 할 수 있다. axis의 값을 설정하여 제어한다.axis=1은 가로 연결을 나타내고 여러 연결의 대상이 목록에 있으면
2、join도 가능
수직 연결
pd.concat([df8,df9],ignore_index=True)
참고 사항:1. 수직으로 합쳐진 데이터는 []로 집합해야 한다
2、ignore_index 기존 줄 인덱스 무시하고 다시 정렬
3、drop_duplicates () 중복 제거
정렬
#
df10.sort_values('score')
# ,
df10.sort_values(['score','group'],ascending=False,na_position='first')
#sort
매개 변수묘사
by
문자열이나 목록, 단일 정렬 필드의 경우 문자열을 사용하고, 여러 개를 지정하면 목록을 사용해야 합니다.
ascending
True일 때는 오름차순으로, 기본값은 오름차순
na_position
빈 값의 위치를 나타냅니다.'last'는 기본이고'first'시작 위치입니다.
그룹화
### groupby
df11.groupby('class')
df11.groupby(['class','grade'])
for cls,data in df11.groupby(['class','grade']):
print(cls)
print(data)
참고 사항:1、groupby가 한 열이면 여러 열이면 []
2,groupby는 하나의 대상을 되돌려주기 때문에 직접 접근할 수 없습니다. for를 사용할 수 있습니다
그룹화된 열 필터링
데이터 열 [열 이름]을 선택하면 데이터 프레임 대상을 되돌려줍니다.
여러 열 데이터를 필터링하는 경우 [] 및 []]를 직접 사용하여 모두 가능
요약 [[열1, 열2,...]]
집합 함수agg 협조 사용
dff.groupby('class')[['math']].agg(['mean','max','min','median','std'])
함수묘사
mean
평균값
max
최대값
min
최소값
median
중위수
std
표준차
count
계수
skew
편도
quantile
분수 자릿수 지정
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Pandas】DatetimeIndex란? no.29안녕하세요, 마유미입니다. Pandas에 대한 기사를 시리즈로 작성하고 있습니다. 이번은 제29회의 기사가 됩니다. 에서 Pandas의 시간에 대한 모듈에 대해 씁니다. 이번 기사에서는, 「DatetimeIndex」...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.