Если, elif и еще в dataframe, чтобы создать новый столбец - PullRequest
0 голосов
/ 04 марта 2020

Попытка создать новый столбец в моем фрейме данных с вызовом «Метод». Текущий фрейм данных на прикрепленном рисунке: enter image description here

Я пытаюсь использовать if / elif / else, а также regex для создания нового столбца, но когда я запускаю этот код, я получить только значение, которое приходит из оператора else. Почему это не работает и как я могу это исправить?

if 'posted' in df2.Full.astype(str) and '/ Outbound' in df2.TPrev.astype(str):
    df2['Method']='Classifieds Homepage Button'
elif 'ad posted' in df2.Full.astype(str) and 'thanks' in df2.TPrev.astype(str):
    df2['Method']='Header after Post'
elif 'ad posted' in df2.Full.astype(str) and '/myaccount/listing-classified Outbound' in df2.TPrev.astype(str):
    df2['Method']='My Listings Button'    
elif 'ad posted' in df2.Full.astype(str) and '/s/' in df2.TPrev.astype(str):
    df2['Method']='SRP'  
elif 'ad posted' in df2.Full.astype(str) and '/myaccount/listing-classified nan' in df2.TPrev.astype(str):
    df2['Method']='My Listings Button'
elif 'ad posted' in df2.Full.astype(str) and '/sell nan nan' in df2.TPrev and '/myaccount/listing-classified nan nan' in df2.Prev.astype(str):
    df2['Method']='My Listings Header'
elif 'ad posted' in df2.Full.astype(str) and '/listing/' in df2.TPrev.astype(str):
    df2['Method']='Detail Page Header'
elif 'ad posted' in df2.Full.astype(str) and '/search/' in df2.TPrev.astype(str):
    df2['Method']='SRP'
else:
    df2['Method']='Ignore'

1 Ответ

0 голосов
/ 05 марта 2020

Как утверждают парни в комментариях, проблема в том, что когда вы присваиваете одно значение столбцу, вы просто переписываете все столбцы, чтобы иметь то же значение, что и назначенное вами. То, что вы хотите сделать, это:

  1. Вместо того, чтобы менять тип на str каждой строки, просто измените весь фрейм данных:

    df2.astype(str)

  2. Вам необходимо иметь лог c, который будет использоваться в каждой строке кадра данных, чтобы определить значение для столбца «Метод». Простейшим способом будет использование созданной вами функции и вызов ее с помощью apply:

def my_logic(row):
   if 'posted' in row.Full and '/ Outbound' in row.TPrev:
      return "Classified Homepage Button"
   elif 'ad posted' in row.Full and 'thanks' in row.TPrev:
      return 'Header after Post'
   elif 'ad posted' in row.Full and '/myaccount/listing-classified Outbound' in row.TPrev:
      return 'My Listings Button'
   elif 'ad posted' in row.Full and '/s/' in row.TPrev:
      return 'SRP'
   elif 'ad posted' in row.Full and '/myaccount/listing-classified nan' in row.TPrev:
      return 'My Listings Button'
   elif 'ad posted' in row.Full and '/sell nan nan' in row.TPrev and '/myaccount/listing-classified nan nan' in row.Prev:
      return 'My Listings Header'
   elif 'ad posted' in row.Full and '/listing/' in row.TPrev:
      return 'Detail Page Header'
   elif 'ad posted' in row.Full and '/search/' in row.TPrev:
      return 'SRP'
   else:
      return 'Ignore'

df2['Method'] = df2.apply(lambda row: my_logic(row), axis=1)

Это будет самое простое преобразование, но я думаю, что гораздо более элегантное решение будет использовать np.select - создайте список ваших выборов и список True / False в соответствии с вашей логикой. Пример с первыми 3 условиями:

conditions = [
   ('posted' in df2.Full) & ('/ Outbound' in df2.TPrev),
   ('ad posted' in df2.Full) & ('thanks' in df2.TPrev),
   ('ad posted' in df2.Full) & ('/myaccount/listing-classified Outbound' in df2.TPrev)]
choices = ['"Classified Homepage Button"', 'Header after Post', 'My Listings Button']
df2['Method'] = np.select(conditions, choices, default='Ignore')
...