web-dev-qa-db-fra.com

Équivalent de R/ifelse en Python/Pandas? Comparer les colonnes de chaîne?

Mon objectif est de comparer deux colonnes et d’ajouter la colonne de résultats. R utilise ifelse mais j'ai besoin de connaître le comportement des pandas.

R

> head(mau.payment)
  log_month user_id install_month payment
1   2013-06       1       2013-04       0
2   2013-06       2       2013-04       0
3   2013-06       3       2013-04   14994

> mau.payment$user.type <-ifelse(mau.payment$install_month == mau.payment$log_month, "install", "existing")
> head(mau.payment)
  log_month user_id install_month payment user.type
1   2013-06       1       2013-04       0  existing
2   2013-06       2       2013-04       0  existing
3   2013-06       3       2013-04   14994  existing
4   2013-06       4       2013-04       0  existing
5   2013-06       6       2013-04       0  existing
6   2013-06       7       2013-04       0  existing

Pandas

>>> maupayment
user_id  log_month  install_month
1        2013-06    2013-04              0
         2013-07    2013-04              0
2        2013-06    2013-04              0
3        2013-06    2013-04          14994

J'ai essayé quelques cas mais je n'ai pas fonctionné. Il semble que la comparaison de chaînes ne fonctionne pas.

>>>np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')

TypeError: 'str' object cannot be interpreted as an integer 

Pourrais-tu m'aider s'il te plait?


Pandas et version numpy.

>>> pd.version.version
'0.16.2'
>>> np.version.full_version
'1.9.2'

Après la mise à jour des versions, cela a fonctionné!

>>> np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
array(['existing', 'install', 'existing', ..., 'install', 'install',
       'install'], 
      dtype='<U8')
15
zono

Vous devez mettre à niveau les pandas vers la dernière version, car dans la version 0.17.1 cela fonctionne très bien.

Exemple (la première valeur de la colonne install_month est modifiée pour correspondre):

print maupayment
  log_month  user_id install_month  payment
1   2013-06        1       2013-06        0
2   2013-06        2       2013-04        0
3   2013-06        3       2013-04    14994

print np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
['install' 'existing' 'existing']
14
jezrael

Une option consiste à utiliser une fonction anonyme en combinaison avec fonction apply du Pandas:

Configurez la logique branching _ dans une fonction: 

def if_this_else_that(x, list_of_checks, yes_label, no_label):
    if x in list_of_checks:
        res = yes_label
    else: 
        res = no_label
    return(res)

Cela prend le x de lambda (voir ci-dessous), un liste de choses à rechercher, le étiquette oui et le pas d'étiquette

Par exemple, supposons que nous examinions le jeu de données IMDB (imdb_df): 

 enter image description here

... et je veux ajouter une nouvelle colonne appelée "new_rating" qui indique si le film est mature ou non. 

Je peux utiliser la fonction Pandas appliquer avec la logique de branchement ci-dessus: 

imdb_df['new_rating'] = imdb_df['Rated'].apply(lambda x: if_this_else_that(x, ['PG', 'PG-13'], 'not mature', 'mature'))

 enter image description here

Il y a aussi des moments où nous devons combiner cela avec une autre vérification. Par exemple, certaines entrées de l'ensemble de données IMDB sont NaN. Je peux vérifier NaN et l’évaluation de la maturité} comme suit: 

imdb_df['new_rating'] = imdb_df['Rated'].apply(lambda x: 'not provided' if x in ['nan'] else if_this_else_that(x, ['PG', 'PG-13'], 'not mature', 'mature'))

Dans ce cas, mon NaN a d'abord été converti en chaîne, mais vous pouvez également le faire avec de véritables NaN. 

0
Cybernetic