2017-02-06 4 views
1

Мне нужно заменить части сокращенных адресов на полный адрес в новом csv, но работать с ошибкой. Как это исправить?Заменить части одного столбца

1234 Edison Ln -----------> 1234 Edison Lane

4589 Переполнение стека Dr -----------> 4589 Stack Overflow Drive

import pandas as pd 

mycsv = pd.read_csv('addressescsv') 
mycsv['Address'] = str.replace({mycsv['Address']: {'Ln': 'Lane','Dr': 'Drive'}}) 

mycsv.to_csv('newAddressescsv', index=False) 

Traceback: 

Traceback (most recent call last): 
File "C:\movingalong.py", line 8, in <module> 
File "C:\Users\Programs\Python\Python36-32\lib\site- 
packages\pandas\core\generic.py", line 831, in __hash__ 
' hashed'.format(self.__class__.__name__)) 
TypeError: 'Series' objects are mutable, thus they cannot be hashed 
+0

http://stackoverflow.com/questions/22588316/pandas- apply-regex-to-replace-values ​​ –

ответ

3

Вы можете использовать DataFrame.replace

df = pd.DataFrame({'Address':['Ln', 'Dr', 'High']}) 
print df.replace({'Address' :{'Ln': 'Lane','Dr': 'Drive'}}) 

Выход

 Address 
0 Lane 
1 Drive 
2 High 

Поскольку вы ищете частичного совпадения вы можете попробовать этот

import re 
import pandas as pd 

df = pd.DataFrame({'Address':['City Ln', 'New Dr', 'Ln']}) 
rep = {'Ln': 'Lane','Dr': 'Drive'} 
regex = re.compile(r"\b((%s)\S*)\b" %"|".join(rep.keys()), re.I) 

def dictionary_lookup(match): 
    return rep[match.group(2)] 

def ReplaceStr(value): 
    NewValue = regex.sub(dictionary_lookup, value) 
    return NewValue 


df["New Address"] = df["Address"].map(lambda x:ReplaceStr(x)) 
print df 

OUTPUT

Address New Address 
0 City Ln City Lane 
1 New Dr New Drive 
2  Ln  Lane 

Вдохновленный https://stackoverflow.com/a/32191354/6626530

+0

Спасибо, но значения подобны этим 1234 Edison Ln, 4785 Stack Overflow Dr. Вот почему я использую str. –

+0

@Pythoner, это тоже сработает - просто попробуйте – MaxU

+0

Я пробовал pd.DataFrame.replace ({mycsv ['Address']: ...... Он по-прежнему бросает ту же ошибку. –

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