무리를 지어 무리를 지어 분류하는 판다
데이터 프레임을 2열로 그룹화한 후 집계된 결과를 그룹별로 정렬합니다.
In [167]: df
Out[167]:
count job source
0 2 sales A
1 4 sales B
2 6 sales C
3 3 sales D
4 7 sales E
5 5 market A
6 3 market B
7 2 market C
8 4 market D
9 1 market E
In [168]: df.groupby(['job','source']).agg({'count':sum})
Out[168]:
count
job source
market A 5
B 3
C 2
D 4
E 1
sales A 2
B 4
C 6
D 3
E 7
이제 각 그룹 내에서 'count' 열을 내림차순으로 정렬한 다음 상위 3개 행만 취하려고 합니다.취득 방법:
count
job source
market A 5
D 4
B 3
sales E 7
C 6
B 4
먼저 정렬을 하고 헤드를 사용하여 각 그룹의 처음 3개를 가져가면 한 번에 할 수도 있습니다.
In[34]: df.sort_values(['job','count'],ascending=False).groupby('job').head(3)
Out[35]:
count job source
4 7 sales E
2 6 sales C
1 4 sales B
5 5 market A
8 4 market D
6 3 market B
여기서도 실제로 그룹바이(첫 번째 그룹바이 결과)를 실시합니다.그룹별로 처음 3개의 요소를 정렬하여 가져옵니다.
첫 번째 그룹바이 결과부터 시작합니다.
In [60]: df_agg = df.groupby(['job','source']).agg({'count':sum})
지수의 첫 번째 수준을 기준으로 그룹화한다.
In [63]: g = df_agg['count'].groupby('job', group_keys=False)
그런 다음 각 그룹을 정렬('순서 지정')하고 처음 세 가지 요소를 취하려고 합니다.
In [64]: res = g.apply(lambda x: x.sort_values(ascending=False).head(3))
단, 이를 위해 숏컷 기능이 있습니다.
In [65]: g.nlargest(3)
Out[65]:
job source
market A 5
D 4
B 3
sales E 7
C 6
B 4
dtype: int64
한 번에 다음과 같이 됩니다.
df_agg['count'].groupby('job', group_keys=False).nlargest(3)
다음은 정렬된 순서에서 상위 3개를 선택하여 그룹 내에서 정렬하는 다른 예입니다.
In [43]: import pandas as pd
In [44]: df = pd.DataFrame({"name":["Foo", "Foo", "Baar", "Foo", "Baar", "Foo", "Baar", "Baar"], "count_1":[5,10,12,15,20,25,30,35], "count_2" :[100,150,100,25,250,300,400,500]})
In [45]: df
Out[45]:
count_1 count_2 name
0 5 100 Foo
1 10 150 Foo
2 12 100 Baar
3 15 25 Foo
4 20 250 Baar
5 25 300 Foo
6 30 400 Baar
7 35 500 Baar
### Top 3 on sorted order:
In [46]: df.groupby(["name"])["count_1"].nlargest(3)
Out[46]:
name
Baar 7 35
6 30
4 20
Foo 5 25
3 15
1 10
dtype: int64
### Sorting within groups based on column "count_1":
In [48]: df.groupby(["name"]).apply(lambda x: x.sort_values(["count_1"], ascending = False)).reset_index(drop=True)
Out[48]:
count_1 count_2 name
0 35 500 Baar
1 30 400 Baar
2 20 250 Baar
3 12 100 Baar
4 25 300 Foo
5 15 25 Foo
6 10 150 Foo
7 5 100 Foo
대신 이 방법을 사용해 보십시오. 이는 그룹별 및 내림차순으로 정렬하는 간단한 방법입니다.
df.groupby(['companyName'])['overallRating'].sum().sort_values(ascending=False).head(20)
컬럼을 합계할 필요가 없는 경우는 @tvashtar의 답변을 사용합니다.합산할 필요가 있다면 @joris의 답변이나 이와 매우 유사한 답변을 사용할 수 있습니다.
df.groupby(['job']).apply(lambda x: (x.groupby('source')
.sum()
.sort_values('count', ascending=False))
.head(3))
by를 사용하지 않고 다음 오류가 발생하였습니다.
TypeError: sort_values()에 필요한 위치 인수 'by'가 1개 누락되었습니다.
그래서 이렇게 바꿨더니 작동하네요.
df.groupby(['job','source']).agg({'count':sum}).sort_values(by='count',ascending=False).head(20)
그룹화된 데이터 프레임에 그룹화된 열("multi-index")이 여러 개 포함되어 있는 경우 다른 방법을 사용하면 다른 열이 지워집니다.
edf = pd.DataFrame({"job":["sales", "sales", "sales", "sales", "sales",
"market", "market", "market", "market", "market"],
"source":["A", "B", "C", "D", "E", "A", "B", "C", "D", "E"],
"count":[2, 4,6,3,7,5,3,2,4,1],
"other_col":[1,2,3,4,56,6,3,4,6,11]})
gdf = edf.groupby(["job", "source"]).agg({"count":sum, "other_col":np.mean})
gdf.groupby(level=0, group_keys=False).apply(lambda g:g.sort_values("count", ascending=False))
이거 계속.other_col
주문에 의해count
각 그룹 내 열
한 줄로 할 수 있습니다.
df.groupby(['job']).apply(lambda x: x.sort_values(['count'], ascending=False).head(3)
.drop('job', axis=1))
apply()는 groupby의 각 그룹을 lambda 함수의 x에 할당합니다.
@joris의 답변이 큰 도움이 되었습니다.이게 나한테 효과가 있었어.
df.groupby(['job'])['count'].nlargest(3)
언급URL : https://stackoverflow.com/questions/27842613/pandas-groupby-then-sort-within-groups
'sourcecode' 카테고리의 다른 글
날짜보다 큰 연산자를 사용하는 방법 (0) | 2022.11.26 |
---|---|
SQL - FROM 절의 하위 쿼리에 문제가 있습니다. (0) | 2022.11.26 |
지정된 수의 요소로 목록을 잘라냅니다. (0) | 2022.11.26 |
volatile 키워드는 무엇에 도움이 됩니까? (0) | 2022.11.26 |
JavaScript 객체 리터럴에서 키에 대한 변수를 사용하는 방법은 무엇입니까? (0) | 2022.11.17 |