잡동사니

반응형

질문

          home_team_name  home_team_goal_count
0         Bayern München                     2
1         Bayern München                     2
2         Bayern München                     1
3                   Köln                     2
4                   Köln                     2

home_team_name 변수의 데이터를 그룹화합니다.

df.groupby("home_team_name")

home_team_goal_count 의 값은 2 또는 1 만 될 수 있습니다. 최소 발생 횟수를 얻고 싶습니다.각 그룹의 값. 내가 원하는 결과는 Bayern Munchen의 경우 1이고 Koln의 경우 0입니다. 바이에른 뮌헨을 설명하기 위해 2 x 2 및 1 x 1이므로 최소값은 1입니다. Koln은 2 x 2 및 0 x 1이므로 최소값은 0입니다.


답변1

SeriesGroupBy.value_counts, 모든 조합 1,2 에 대해 0모양을 변경하고 추가하고 마지막으로 최소 min 을 가져옵니다. :

s = (df.groupby("home_team_name")['home_team_goal_count']
       .value_counts()
       .unstack(fill_value=0)
       .min(axis=1))

print (s)
home_team_name
Bayern München    1
Köln              0
dtype: int64

세부 정보 :

print (df.groupby("home_team_name")['home_team_goal_count']
         .value_counts()
         .unstack(fill_value=0))
home_team_goal_count  1  2
home_team_name            
Bayern München        1  2
Köln                  0  2

가능한 경우 1또는 입력 데이터의 2값만 재색 인필요합니다.

s = (df.groupby("home_team_name")['home_team_goal_count']
       .value_counts()
       .unstack(fill_value=0)
       .reindex([1, 2], axis=1, fill_value=0) 
       .min(axis=1))


답변2

import pandas as pd
import numpy as np
list1=['Bayern Munchen','Bayern Munchen','Bayern Munchen','FC Koln','FC Koln']
list2=[2,2,1,2,2]
d={'Home Team Name':list1,'Home Team Goal Count':list2}
data=pd.DataFrame(d)

data['Name']= data['Home Team Name'] +" "+ data['Home Team Goal Count'].astype(str)

data['Name']
Out[39]: 
0    Bayern Munchen 2
1    Bayern Munchen 2
2    Bayern Munchen 1
3           FC Koln 2
4           FC Koln 2

name,count=np.unique(data['Name'].tolist(),return_counts=True)

name=[' '.join(x.split(' ')[:-1]) for x in name]

name
Out[99]: ['Bayern Munchen', 'Bayern Munchen', 'FC Koln']

min_val=pd.DataFrame({"Name":name,"Count":count})

name=[]
min_val_count=[]
for x in min_val.Name.unique():
    name.append(min_val[min_val.Name!=x].min()[0])
if min_val[min_val.Name!=x].min()[1]==2:
    min_val_count.append(0)
else:
    min_val_count.append(min_val[min_val.Name!=x].min()[1])


minimum_val_dict=dict(zip(name,min_val_count))

minimum_val_dict
Out[104]: {'FC Koln': 0, 'Bayern Munchen': 1}

위의 답변에 비해 약간 더 긴 버전입니다.



답변3

pd.crosstab :

pd.crosstab(df['home_team_name'], df['home_team_goal_count'])\
    .reindex([1, 2], axis=1, fill_value=0).min(1)

결과:

home_team_name
Bayern München    1
Köln              0
dtype: int64


답변4

이를 수행하는 또 다른 방법은 유한 한 상태 집합이 있기 때문에 범주 변수를 사용하는 것입니다. 그래서:

(
    df
    .astype({"home_team_goal_count": "category"})
    .groupby("home_team_name")["home_team_goal_count"]
    .apply(lambda x: x.value_counts().min())
)

가장 적게 발생한 값을 알고 싶다면 .min ()대신 .idxmin () 을 호출 할 수 있습니다.



 

 

 

 

출처 : https://stackoverflow.com/questions/63048863/how-to-get-minimum-number-of-occurrences-of-value-in-pandas-groupby

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band