J'aimerais que le nombre d'articles apparaissant dans un achat soit indiqué dans un diagramme circulaire. Seuls les 3 meilleurs produits doivent être répertoriés dans leur ensemble et le reste doit être résumé en Other.

   import pandas as pd
d = {'buyerid': [0,0,1,2,3,3,3,4,4,4],
         'itemid': [0,1,1,1,1,0,1,4,5,0],
         'description': ['Banana', 'Apple', 'Apple', 'Strawberry', 'Apple', 'Banana', 'Apple', 'Dog-Food', 'Beef', 'Banana',], }
df = pd.DataFrame(data=d)
display(df.head(10))
    
purch = df['buyerid'].nunique()
df1 = df.groupby(['itemid','description']).size().div(purch).reset_index(name='percentage')
print (df1)
    
   itemid description  percentage
0       0      Banana         0.6
1       1       Apple         0.8
2       1  Strawberry         0.2
3       4    Dog-Food         0.2
4       5        Beef         0.2

df_top = df[['itemid', 'percentage']].head(5)
plot = df_top .plot.pie(y='percentage', figsize=(7, 7))

Ce que j'ai actuellement

enter image description here

Ce que je veux (Notez que ces données ne sont que stupides. Elles n'ont rien en commun avec les données ci-dessus. Ces données ne devraient représenter que ce que je veux)

enter image description here

1
user14253628 12 nov. 2020 à 09:57

1 réponse

Meilleure réponse

Dans cette réponse, je suppose que l'identifiant de l'acheteur et l'identifiant de l'élément n'ont aucun but, jetez un œil et voyez si c'est ce que vous voulez.

d = {'itemid': [0,1,1,1,1,0,1,4,5,0],
'description': ['Banana', 'Apple', 'Apple', 'Strawberry', 'Apple', 'Banana', 'Apple', 'Dog-Food', 'Beef', 'Banana',], }
df = pd.DataFrame(data=d)
ser = df.groupby('description')['itemid'].count()
### Combine categories
ser = ser.sort_values(ascending=False)
ser['Others'] = ser[3:].sum()
ser = ser.iloc[[0,1,2,-1]]
print(ser)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.pie(ser.values, labels=ser.index, startangle=90, autopct=lambda x:int(x/100.*ser.sum()), pctdistance=0.8, counterclock=False)
ax.legend()
plt.axis('equal')
plt.show()

enter image description here

0
Benedictanjw 12 nov. 2020 à 08:09