Powiedzmy: jest ramka danych:

country       edition  sports       Athletes               Medals
Germany          1990    Aquatics  HAJOS, Alfred           silver
Germany          1990    Aquatics  HIRSCHMANN, Otto        silver
Germany          1990    Aquatics  DRIVAS, Dimitrios       silver
US               2008    Athletics MALOKINIS, Ioannis      silver
US               2008    Athletics HAJOS, Alfred           silver
US               2009    Athletics CHASAPIS, Spiridon      gold
France           2010    Athletics CHOROPHAS, Efstathios   gold
France           2010    golf      HAJOS, Alfred           silver
France           2011    golf      ANDREOU, Joannis        silver

Chcę się dowiedzieć, która edycja przyniosła najwięcej srebrnych medali? więc próbuję rozwiązać to za pomocą funkcji grupowania w ten sposób:

df.groupby('Edition')[df['Medal']=='Silver'].count().idxmax() 

Ale to mi daje

Key error = 'Columns not found: False, True'

Czy ktoś może mi powiedzieć, na czym polega problem?

0
prabs 16 grudzień 2019, 19:20
Byłoby miło zobaczyć też błąd.
 – 
Oleg Butuzov
16 grudzień 2019, 19:25
1
df['Medals' == 'Silver'] to prawie to samo, co powiedzenie df[False], ponieważ „Medale” i „Srebro” to nie to samo. Ale False nie jest kolumną w ramce danych, więc wyświetla ten błąd. Spróbuj tego: df[df['Medals']=='silver'].groupby('Edition').count().idxmax()
 – 
Buckeye14Guy
16 grudzień 2019, 19:35
ValueError: próba uzyskania argmax pustej sekwencji, która wyrzuca ten błąd
 – 
prabs
16 grudzień 2019, 19:40
df[df['Medals']=='silver'].groupby('edition')['Medals'].count().idxmax(). Przepraszamy „Edycja” nie jest kolumną, więc nie możesz pogrupować według tego
 – 
Buckeye14Guy
16 grudzień 2019, 19:41
Dzięki za drobną poprawkę, ale powinna to być size() zamiast count()
 – 
prabs
16 grudzień 2019, 19:55

5 odpowiedzi

df.groupby('Edition')[df['Medals'=='Silver']].count().idxmax() 

Czy powinien mieć pojedynczy cudzysłów w pobliżu medali?

0
Oleg Butuzov 16 grudzień 2019, 19:24

Oto twoja ramka danych pandy:

import pandas as pd

data = [
    ['Germany', 1990, 'Aquatics', 'HAJOS, Alfred', 'silver'], 
    ['Germany', 1990, 'Aquatics', 'IRSCHMANN, Otto', 'silver'], 
    ['Germany', 1990, 'Aquatics', 'DRIVAS, Dimitrios', 'silver'], 
    ['US', 2008, 'Athletics', 'MALOKINIS, Ioannis', 'silver'], 
    ['US', 2008, 'Athletics', 'HAJOS, Alfred', 'silver'], 
    ['US', 2009, 'Athletics', 'CHASAPIS, Spiridon', 'gold'], 
    ['France', 2010, 'Athletics', 'CHOROPHAS, Efstathios', 'gold'], 
    ['France', 2010, 'golf', 'HAJOS, Alfred', 'silver'], 
    ['France', 2011, 'golf', 'ANDREOU, Joannis', 'silver']
]

df = pd.DataFrame(data, columns = ['country', 'edition', 'sports', 'Athletes', 'Medals'])
print(df) 

   country  edition     sports               Athletes  Medals
0  Germany     1990   Aquatics          HAJOS, Alfred  silver
1  Germany     1990   Aquatics        IRSCHMANN, Otto  silver
2  Germany     1990   Aquatics      DRIVAS, Dimitrios  silver
3       US     2008  Athletics     MALOKINIS, Ioannis  silver
4       US     2008  Athletics          HAJOS, Alfred  silver
5       US     2009  Athletics     CHASAPIS, Spiridon    gold
6   France     2010  Athletics  CHOROPHAS, Efstathios    gold
7   France     2010       golf          HAJOS, Alfred  silver
8   France     2011       golf       ANDREOU, Joannis  silver

Teraz możesz po prostu przefiltrować srebrne medale, a następnie wydanie groupby (pamiętaj, że 'Edition' wyrzuci KeyError w przeciwieństwie do 'edition') i ostatecznie wyliczyć:

df[df.Medals == 'silver'].groupby('edition').count()['Medals'].idxmax()
>>> 1990
3
Giorgos Myrianthous 16 grudzień 2019, 19:42
Df[df['Medale']=='srebro'].groupby('edycja').size().idxmax() teraz poprawione! daje taki sam wynik jak ty.
 – 
prabs
16 grudzień 2019, 20:17

Df [df ['Medal'] == 'srebrny']. groupby ('edycja'). rozmiar (). idxmax ()

Próbowałem tego i zadziałało! właśnie zastąpiłem count () rozmiarem ()

0
prabs 16 grudzień 2019, 19:54
Wygląda bardzo podobnie do mojego.
 – 
Oleg Butuzov
16 grudzień 2019, 20:06

Powinieneś liczyć na wydanie na medal:

>>> df = pd.DataFrame({'edition':[1990,1990,1990,2008,2008,2009,2010,2010,2011],'Medals':['silver','silver','silver','silver','silver','gold','gold','silver','silver']})
>>> df['count'] = ''
>>> df['count'] = df.groupby(['edition','Medals']).transform('count')

Następnie wykonaj filtrowanie na max ():

>>> df = df[df['Medals'].isin(['silver'])]
>>> df
   edition  Medals  count
0     1990  silver      3
1     1990  silver      3
2     1990  silver      3
3     2008  silver      2
4     2008  silver      2
7     2010  silver      1
8     2011  silver      1
>>> df = df[df['count'].isin([df['count'].max()])]
>>> df
   edition  Medals  count
0     1990  silver      3
1     1990  silver      3
2     1990  silver      3

Lub

>>> df[df['count'].isin([df['count'].max()])]['Medals'].unique()[0]

'silver'
0
Joe 16 grudzień 2019, 19:54

Możesz pogrupować według obu kolumn, aby rozwiązać:

df[df['Medals'] == 'silver'].groupby(['edition','Medals'],as_index=True)['Athletes'].count().idxmax()

# Outcome:
(1990, 'silver')
1
Yaakov Bressler 16 grudzień 2019, 19:49
„Srebro” to nie kolumna :)
 – 
Buckeye14Guy
16 grudzień 2019, 19:46
Poprawione @Buckeye14Guy
 – 
Yaakov Bressler
16 grudzień 2019, 19:49