열로 count
그룹화 한 후 팬더 데이터 프레임에서 열의 최대 값을 갖는 모든 행을 어떻게 찾 ['Sp','Mt']
습니까?
예제 1 : 다음 dataFrame은 다음과 같이 그룹화합니다 ['Sp','Mt']
.
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
예상 출력 : 그룹 간 개수가 최대 인 결과 행을 가져옵니다.
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
예제 2 : 이 데이터 프레임은 다음과 같이 그룹화됩니다 ['Sp','Mt']
.
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
위의 예에서, 각 그룹에서 max와 같은 모든 행 을 가져 count
오려고합니다.
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
답변
In [1]: df
Out[1]:
Sp Mt Value count
0 MM1 S1 a 3
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk 8
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi 7
In [2]: df.groupby(['Mt'], sort=False)['count'].max()
Out[2]:
Mt
S1 3
S3 8
S4 10
S2 7
Name: count
원본 DF의 색인을 얻으려면 다음을 수행하십시오.
In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']
In [4]: df[idx]
Out[4]:
Sp Mt Value count
0 MM1 S1 a 3
3 MM2 S3 mk 8
4 MM2 S4 bg 10
8 MM4 S2 uyi 7
그룹당 최대 값이 여러 개인 경우 모두 반환됩니다.
최신 정보
우박 메리 기회에 이것이 OP가 요청하는 것입니다.
In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)
In [6]: df
Out[6]:
Sp Mt Value count count_max
0 MM1 S1 a 3 3
1 MM1 S1 n 2 3
2 MM1 S3 cb 5 8
3 MM2 S3 mk 8 8
4 MM2 S4 bg 10 10
5 MM2 S4 dgd 1 10
6 MM4 S2 rd 2 7
7 MM4 S2 cb 2 7
8 MM4 S2 uyi 7 7
답변
dataFrame을 개수별로 정렬 한 다음 중복을 제거 할 수 있습니다. 더 쉽다고 생각합니다.
df.sort_values('count', ascending=False).drop_duplicates(['Sp','Mt'])
답변
쉬운 해결책은 idxmax () 함수 를 적용 하여 최대 값을 가진 행의 인덱스를 얻는 것입니다.
이것은 그룹에서 최대 값을 가진 모든 행을 필터링합니다.
In [365]: import pandas as pd
In [366]: df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})
In [367]: df
Out[367]:
count mt sp val
0 3 S1 MM1 a
1 2 S1 MM1 n
2 5 S3 MM1 cb
3 8 S3 MM2 mk
4 10 S4 MM2 bg
5 1 S4 MM2 dgb
6 2 S2 MM4 rd
7 2 S2 MM4 cb
8 7 S2 MM4 uyi
### Apply idxmax() and use .loc() on dataframe to filter the rows with max values:
In [368]: df.loc[df.groupby(["sp", "mt"])["count"].idxmax()]
Out[368]:
count mt sp val
0 3 S1 MM1 a
2 5 S3 MM1 cb
3 8 S3 MM2 mk
4 10 S4 MM2 bg
8 7 S2 MM4 uyi
### Just to show what values are returned by .idxmax() above:
In [369]: df.groupby(["sp", "mt"])["count"].idxmax().values
Out[369]: array([0, 2, 3, 4, 8])
답변
비교적 큰 DataFrame (~ 400k 행)에서 Zelazny가 제안한 솔루션을 시도한 결과 매우 느립니다. 다음은 내 데이터 세트에서 수십 배 더 빠르게 실행되는 대안입니다.
df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})
df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})
df_grouped = df_grouped.reset_index()
df_grouped = df_grouped.rename(columns={'count':'count_max'})
df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])
df = df[df['count'] == df['count_max']]
답변
sort_values
+를 사용하여 by by group과 관련이 없을 수도 있습니다.drop_duplicates
df.sort_values('count').drop_duplicates(['Sp','Mt'],keep='last')
Out[190]:
Sp Mt Value count
0 MM1 S1 a 3
2 MM1 S3 cb 5
8 MM4 S2 uyi 7
3 MM2 S3 mk 8
4 MM2 S4 bg 10
또한 거의 동일한 논리를 사용하여 tail
df.sort_values('count').groupby(['Sp', 'Mt']).tail(1)
Out[52]:
Sp Mt Value count
0 MM1 S1 a 3
2 MM1 S3 cb 5
8 MM4 S2 uyi 7
3 MM2 S3 mk 8
4 MM2 S4 bg 10
답변
나에게 가장 쉬운 해결책은 count가 최대 일 때 가치를 유지하는 것입니다. 따라서 다음과 같은 한 줄 명령으로 충분합니다.
df[df['count'] == df.groupby(['Mt'])['count'].transform(max)]
답변
사용 groupby
및 idxmax
방법 :
-
열
date
을datetime
다음으로 전송 :df['date']=pd.to_datetime(df['date'])
-
의 인덱스 얻을
max
열date
, 후를groupyby ad_id
:idx=df.groupby(by='ad_id')['date'].idxmax()
-
원하는 데이터를 얻습니다.
df_max=df.loc[idx,]
밖으로 [54] :
ad_id price date
7 22 2 2018-06-11
6 23 2 2018-06-22
2 24 2 2018-06-30
3 28 5 2018-06-22