pandas 그룹by 그룹 대상의 그룹 내 정렬 솔루션

4931 단어 pandasgroupby정렬

질문:


데이터 열에 따라 그룹을 나누고 다른 열 크기 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
분수 자릿수 지정
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기