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')
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']
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):
... 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'))
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.