Как утверждают парни в комментариях, проблема в том, что когда вы присваиваете одно значение столбцу, вы просто переписываете все столбцы, чтобы иметь то же значение, что и назначенное вами. То, что вы хотите сделать, это:
Вместо того, чтобы менять тип на str каждой строки, просто измените весь фрейм данных:
df2.astype(str)
Вам необходимо иметь лог 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')