it-swarm.com.de

Entspricht R/ifelse in Python/Pandas? String-Spalten vergleichen?

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')
15
zono

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']
14
jezrael

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): 

 enter image description here

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

 enter image description here

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. 

0
Cybernetic