0
votes

Plusieurs déclarations conditionnelles avec groupeby en pandas

J'ai un jeu de données similaire à ce qui suit.

df =pd.read_csv('file.csv')
def SortMood(df)
df['mood']=[] #empty column as a list in the df to store the mood 
 for score in df['score']:
      if score>(0.05):
            df['mood'].append('positive')
      elif -0.05<=score <=.05:
            df['mood'].append('neutral')
      else:
          df['mood'].append('negative')


5 commentaires

Quelle est votre sortie attendue lorsque différents scores pour la même date donnent des réponses différentes?


@andrew_reece Il est en fonction des déclarations if / else. En fait, j'ai beaucoup de scores différents pour la même date. Merci


Est-ce que cela répond à votre question? Ajouter une nouvelle colonne à Python Pandas Dataframe basé sur plusieurs Conditions


@Non_linear Ce qui n'est pas clair, c'est la manière dont les instructions if / else doivent s'appliquer dans le cas où vous avez plusieurs évaluations pour la même date. Et vous attendez-vous à une seule sortie par date? Si tel est le cas, cela nécessitera un groupeby . Il serait utile que vous puissiez (a) spécifier votre sortie attendue complet et (b) incluent un boîtier de bord avec deux résultats différents pour la même date. (Actuellement 15/1/16 a deux entrées mais elles évaluent tous les deux à poser.)


@andrew_reece J'aurais probablement dû mettre ça. Mais votre solution suggérée prend aussi soin de ce problème. Je viens de vérifier le résultat de la sortie à une date unique avec 3 cas différents (positifs, négatifs et neutres) avec des scores différents et semble les classer correctement. Merci.


3 Réponses :


1
votes

Utiliser Appliquer CODE>:

def determine_mood(row, thresh=.05):
    if row.score < -thresh:
        return "negative"
    elif row.score > thresh:
        return "positive"
    else:
        return "neutral"

df["mood"] = df.apply(determine_mood, axis=1)

df
      date   score      mood
0   3/1/16  0.6369  positive
1   5/1/16 -0.2023  negative
2   6/1/16  0.0400   neutral
3   7/1/16  0.0772  positive
4   9/1/16 -0.4215  negative
5  12/1/16  0.2960  positive
6  15/1/16  0.2500  positive
7  15/1/16  0.7684  positive


0 commentaires

2
votes

Utilisez pd.cut à bin vos données à catégorique: xxx

ou utilisez numpy.select pour une colonne conditionnelle multiple vectorisée: xxx


3 commentaires

C'est presque certainement une solution plus rapide que d'utiliser appliquer . Pour op, si l'efficacité est importante, je suggérerais d'aller avec la réponse de @ Erfan.


J'oublie toujours couper , grande solution +1


Oui. Ceci est vraiment beaucoup plus rapide que la solution d'Andrew_Reece. Et fonctionne très bien pour mon jeu de données humanisant (des millions de rangées). Je vais le changer. Merci.



1
votes

Il y a plusieurs façons de le faire. Très similaire à votre approche serait le appliquer code> méthode de pandas: xxx pré>

ou raccourcissez-le avec une expression Lambda à: p>

df.loc[:,'mood'] = df['score'].map(lambda x: 'positive' if x > 0.05 else ('neutral' if x > -0.05 else 'negative'))


0 commentaires