Mam testową ramkę danych:

data= (['a','test1', 'cat'], ['a','test1', 'cat'], ['b', 'test2', 'dog'])
pd.DataFrame(data, columns= ['col1','col2','col3'])

W jaki sposób mógłbym grupować według col1, col2 i col3, a także mieć liczbę i procent każdej grupy posortowane z najwyższą u góry?

Oczekiwany wynik to:

a test1 cat 2 66.6
b test2 dog 1 33.3

Dziękuję Ci!

2
user90831 2 kwiecień 2020, 19:54

3 odpowiedzi

Najlepsza odpowiedź

Oto inny sposób korzystania z { {X0}} i { {X1}}:

g = df.groupby(['col1','col2','col3'],sort=False)
s = g.ngroup().value_counts(normalize=True,sort=False)
s.index = g.groups.keys()

out = g.size().to_frame('Size').assign(Percentage=s.mul(100).round(2)).reset_index()

  col1   col2 col3  Size  Percentage
0    a  test1  cat     2       66.67
1    b  test2  dog     1       33.33
4
anky 2 kwiecień 2020, 17:42
# sample data
data= (['a','test1', 'cat'], ['a','test1', 'cat'], ['b', 'test2', 'dog'])
df = pd.DataFrame(data, columns= ['col1','col2','col3'])

# create a function that calls df and the len of the frame
def my_func(df, l=len(df)):
    data = {
        'count': df['col3'].count(),
        'percent': df['col3'].count() / l*100
    }

    return pd.Series(data)

# groupby and apply the function and sort values
df.groupby(['col1', 'col2', 'col3']).apply(my_func).sort_values('percent', ascending=False)

                 count    percent
col1 col2  col3                  
a    test1 cat     2.0  66.666667
b    test2 dog     1.0  33.333333
1
It_is_Chris 2 kwiecień 2020, 17:16

Spróbuj tego

df_final = df.groupby(df.columns.tolist()).size().reset_index(name='counts')    
df_final['percentage'] = df_final.counts / len(df) * 100

Out[78]:
  col1   col2 col3  counts  percentage
0    a  test1  cat       2    66.6667
1    b  test2  dog       1    33.3333
2
Andy L. 2 kwiecień 2020, 17:29