2017-02-10 3 views
2

У меня есть список различных значений, которые мне нужно заменить одним значением (Drive-by). Я сделал свое исследование, но ближайший пост, который я смог найти, - это ссылка ниже, которая не использует Pandas. Каков наиболее жизнеспособный способ добиться этого?Заменить несколько значений одним значением с помощью Pandas

Python replace multiple strings

fourth = pd.read_csv('C:/infocentertracker.csv') 
fourth = fourth.rename(columns={'Phone Number: ': 'Phone Number:'}) 
fourth['Source:'] = fourth['Source:'].replace('......', 'Drive-by') 

fourth.to_csv(.............) 

Drive By 
Drive-By 
Drive-by; Return Visitor 
Drive/LTX.com/Internes Srch     Replace all with Drive-by 
Driving By/Lantana Website 
Drive by 
Driving By/Return Visitor 
Drive by/Resident Referral 
Driving by 
Drive- by 
Driving by/LTX Website 
Driving By 
Driving by/Return Visitor 
Drive By/Return Visitor 
Drive By/LTX Website 
+0

это с уверенностью предположить, что только целевые значения начните с «Driv»? – Marat

+0

Да, можно предположить. –

ответ

1

Один из вариантов заключается в следующем, как вы просили метод панд:

fourth.ix[fourth['column name with values'].str.contains('driv', case=False, na=False), 'column name with values'] = 'Drive-by' 

Я предпочел бы использовать регулярное выражение, которое не обязательно требует панд:

import re 

[re.sub('(Driv.+)', 'Drive-by', i) for i in fourth['column name']] 
+0

Спасибо, я получаю ошибку ... ValueError: не может индексировать с вектором, содержащим значения NA/NaN –

+0

@Pythoner Я добавил дополнительный параметр в str.contains, который является 'na = False'. Все нативные функции панд. Просто не было уверенно, как выглядели ваши данные. –

+0

Работал с большой благодарностью А.Кот. –

2

Вы можете использовать булевую маску на str.startswith для замены всех значений start s с Driv и идеи от comment of Marat:

df.loc[df.col.str.startswith('Driv'), 'col'] = 'Drive-by' 

Пример:

print (fourth) 
          col 
0      Drive By 
1      Drive-By 
2  Drive-by; Return Visitor 
3 Drive/LTX.com/Internes Srch 
4 Driving By/Lantana Website 
5      Drive by 
6  Driving By/Return Visitor 
7 Drive by/Resident Referral 
8     Driving by 
9      Drive- by 
10  Driving by/LTX Website 
11     Driving By 
12 Driving by/Return Visitor 
13  Drive By/Return Visitor 
14   Drive By/LTX Website 
15       aaa 
fourth.loc[fourth['Source:'].str.startswith('Driv'), 'Source:'] = 'Drive-by' 
print (fourth) 
    Source: 
0 Drive-by 
1 Drive-by 
2 Drive-by 
3 Drive-by 
4 Drive-by 
5 Drive-by 
6 Drive-by 
7 Drive-by 
8 Drive-by 
9 Drive-by 
10 Drive-by 
11 Drive-by 
12 Drive-by 
13 Drive-by 
14 Drive-by 
15  aaa 

Другое решение с Series.mask:

fourth['Source:']=fourth['Source:'].mask(fourth['Source:'].str.startswith('Driv', na=False), 
             'Drive-by') 
print (fourth) 
    Source: 
0 Drive-by 
1 Drive-by 
2 Drive-by 
3 Drive-by 
4 Drive-by 
5 Drive-by 
6 Drive-by 
7 Drive-by 
8 Drive-by 
9 Drive-by 
10 Drive-by 
11 Drive-by 
12 Drive-by 
13 Drive-by 
14 Drive-by 
15  aaa 
+0

Спасибо, извините, если это может показаться глупым, я попробовал четвертый.loc [4th.col.str.startswith ('Driv'), 'Source:'] = 'Drive-by', но он выкинул ошибку .... .'DataFrame 'не имеет атрибута' col ' –

+0

Это столбец nmae, я меняю его по имени столбца на 'Source:' – jezrael

Смежные вопросы