Powiedzmy, że mam dataframe (po prostu użyję prostego przykładu), który wygląda tak:

import pandas as pd

df = {'Col1':[3,4,2,6,5,7,3,4,9,7,1,3],
      'Col2':['B','B','B','B','A','A','A','A','C','C','C','C',], 
      'Col3':[1,1,2,2,1,1,2,2,1,1,2,2]}

df = pd.DataFrame(df)

Co daje dataframe tak:

    Col1 Col2  Col3
0      3    B     1
1      4    B     1
2      2    B     2
3      6    B     2
4      5    A     1
5      7    A     1
6      3    A     2
7      4    A     2
8      9    C     1
9      7    C     1
10     1    C     2
11     3    C     2 

Co chcę zrobić, to kilka kroków:

1) Dla każdej unikalnej wartości w COL2 i dla każdej unikalnej wartości w COL3, średnia Col1. Więc pożądane wyjście byłoby:

         Avg   Col2  Col3
    1    3.5    B     1
    2      4    B     2
    3      6    A     1
    4    3.5    A     2
    5      8    C     1
    6      2    C     2 

2) Teraz, dla każdej unikalnej wartości w COL3, chcę najwyższą średnią i odpowiednią wartość w COL2. Więc

     Best Avg   Col2  Col3
    1      8    C     1
    2      4    B     2

Moja próba używa df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'}).groupby(['Col3']).agg({'Col1':'max'})

Daje to najwyższą średnią dla każdej wartości COL3, ale nie odpowiedniej etykiety COL2. Dziękujemy za pomocną pomoc!

4
DeathbyGreen 21 luty 2019, 20:52

2 odpowiedzi

Najlepsza odpowiedź

Po pierwszym groupby do sort_values + drop_duplicates

g1=df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'})
g1.sort_values('Col1').drop_duplicates('Col3',keep='last')
Out[569]: 
   Col3 Col2  Col1
4     2    B   4.0
2     1    C   8.0

Lub w przypadku zduplikowania maksymalnej wartości średniej

g1[g1.Col1==g1.groupby('Col3').Col1.transform('max')]
2
BENY 21 luty 2019, 17:58

Wykonaj następujące czynności (nieznacznie zmodyfikowałem kod, aby był trochę krótszy):

df2 = df.groupby(['Col3','Col2'], as_index = False).mean()

Po wydrukowaniu wyniku, na Twój wkład, otrzymasz:

   Col3 Col2  Col1
0     1    A   6.0
1     1    B   3.5
2     1    C   8.0
3     2    A   3.5
4     2    B   4.0
5     2    C   2.0

Następnie uruchomić:

res = df2.iloc[df2.groupby('Col3').Col1.idxmax()]

Po wydrukowaniu wyniku otrzymasz:

   Col3 Col2  Col1
2     1    C   8.0
4     2    B   4.0

Jak widzisz:

  • idxmax daje indeks wiersza z "maksymalnym" elementem (dla każdego Grupa),
  • Ten wynik możesz użyć jako argument iloc.
1
Valdi_Bo 21 luty 2019, 18:29