Je dois compter et additionner des totaux sur une trame de données, mais avec une condition:

fruit days_old
apple 4
apple 5
orange 1
orange 5

Je dois compter avec la condition qu'un fruit ait plus de 3 jours. Donc, la sortie dont j'ai besoin est

2 pommes et 1 orange

Je pensais que je devrais utiliser une fonction Apply, mais je devrais enregistrer chaque type de fruit dans une variable ou quelque chose. Je suis sûr qu'il existe un moyen plus simple.

Ps. J'ai cherché mais je ne vois pas de moyen clair de créer des tableaux ici avec un espacement approprié. La seule chose qui est claire est de ne pas copier et coller avec des onglets!

3
Chuck Pedro 12 avril 2018 à 20:31

4 réponses

Meilleure réponse

Une façon consiste à utiliser pd.Series.value_counts:

res = df.loc[df['days_old'] > 3, 'fruit'].value_counts()

# apple     2
# orange    1
# Name: fruit, dtype: int64

L'utilisation de pd.DataFrame.apply est déconseillée car cela entraînerait une boucle inefficace.

3
jpp 12 avril 2018 à 17:33

Les méthodes value_counts() décrites par @jpp et @chrisz sont excellentes. Pour publier une autre stratégie, vous pouvez utiliser {{X1 }}:

df[df.days_old > 3].groupby('fruit').size()

# fruit
# apple     2
# orange    1
# dtype: int64
2
sacuL 12 avril 2018 à 17:45

Vous pouvez utiliser value_counts() :

In [120]: df[df.days_old > 3]['fruit'].value_counts()
Out[120]:
apple     2
orange    1
Name: fruit, dtype: int64
3
user3483203 12 avril 2018 à 17:34

Je voulais dans la partie variation.

pd.factorize + np.bincount

f, u = pd.factorize(df.fruit)
pd.Series(
    np.bincount(f, df.days_old > 3).astype(int), u
)

apple     2
orange    1
dtype: int64
3
piRSquared 12 avril 2018 à 17:54