Mein Ziel ist es, zwei Spalten zu vergleichen und die Ergebnisspalte hinzuzufügen. R benutzt ifelse, aber ich muss den Weg des Pandas kennen.
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
Ich habe einige Fälle ausprobiert, aber nicht funktioniert. Es scheint, dass der String-Vergleich nicht funktioniert.
>>>np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
TypeError: 'str' object cannot be interpreted as an integer
Kannst du mir bitte helfen?
Pandas und Numpy-Version.
>>> pd.version.version
'0.16.2'
>>> np.version.full_version
'1.9.2'
Nach dem Update der Versionen hat es geklappt!
>>> np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
array(['existing', 'install', 'existing', ..., 'install', 'install',
'install'],
dtype='<U8')
Sie müssen Pandas auf die letzte Version aktualisieren, da sie in Version 0.17.1
sehr gut funktioniert.
Beispiel (erster Wert in Spalte install_month
wird für den Abgleich geändert):
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']
Eine Option ist die Verwendung einer anonyme Funktion in Kombination mit Pandas Anwendungsfunktion :
Richten Sie eine Verzweigung - Logik in einer Funktion ein:
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)
Dies erfordert das x von Lambda (siehe unten), ein list der zu suchenden Dinge, das yes label und das no label .
Angenommen, wir betrachten die IMDB-Datenmenge (imdb_df):
... und ich möchte eine neue Spalte mit dem Namen "new_rating" hinzufügen, die anzeigt, ob der Film ausgereift ist oder nicht.
Ich kann Pandas apply -Funktion zusammen mit meiner oben genannten Verzweigungslogik verwenden:
imdb_df['new_rating'] = imdb_df['Rated'].apply(lambda x: if_this_else_that(x, ['PG', 'PG-13'], 'not mature', 'mature'))
Es gibt auch Zeiten, in denen wir dies mit einem anderen Check kombinieren müssen. Einige Einträge im IMDB-Dataset sind beispielsweise NaN . Ich kann sowohl für NaN als auch für das Reifegrad-Rating wie folgt prüfen:
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'))
In diesem Fall wurde mein NaN zuerst in eine Zeichenfolge umgewandelt, aber Sie können dies natürlich auch mit echten NaNs tun.