2016-03-17 17 views
7

Próbuję wyczyścić niektóre dane, które mam z pliku Excela. Plik zawiera 7400 wierszy i 18 kolumn, w tym listę klientów z ich odpowiednimi adresami i innymi danymi. Problem, który napotykam, polega na tym, że niektóre z miast są błędnie napisane, co zniekształca informacje i utrudnia dalsze przetwarzanie.Pandy zastępują wiele wartości jednocześnie

SURNAME | ADDRESS   | CITY 
0 Jenson | 252 Des Chênes | D.DO 
1 Jean  | 236 Gouin  | DOLLARD 
2 Denis  | 993 Boul. Gouin | DOLLARD-DES-ORMEAUX 
3 Bradford | 1690 Dollard #7 | DDO 
4 Alisson | 115 Du Buisson | IL PERROT 
5 Abdul  | 9877 Boul. Gouin | Pierrefonds 
6 O'Neil | 5 Du College  | Ile Bizard 
7 Bundy  | 7345 Sherbrooke | ILLE Perot 
8 Darcy  | 8671 Anthony #2 | ILE Perrot 
9 Adams  | 845 Georges  | Pierrefonds 

W powyższym przykładzie D.DO, Dollard, DDO powinny być zapisane Dollard-des-ormeaux i IL PERROT Ille Perot, Ile PERROT powinny być zapisane Ile-perrot.

byłem w stanie zastąpić wartości za pomocą:

df["CITY"].replace(to_replace={"D.DO", "DOLLARD", "DDO"}, value="DOLLARD-DES-ORMEAUX", regex=True) 
df["CITY"].replace(to_replace={"IL PERROT", "ILLE PEROT", "ILE PERROT"}, value="ILE-PERROT", regex=True) 

Czy istnieje jakiś sposób, łącząc powyższe operacje w jednym? Próbowałem:

df["CITY"].replace({to_replace={"D.DO", "DOLLARD", "DDO"}, value="DOLLARD-DES-ORMEAUX", to_replace={"IL PERROT", "ILLE PEROT", "ILE PERROT"}, value="ILE-PERROT"}, regex=True) 

ale miałem szczęścia

Odpowiedz

8

spróbować .replace({}, regex=True) metoda:

replacements = { 
    'CITY': { 
     r'(D.*DO|DOLLARD.*)': 'DOLLARD-DES-ORMEAUX', 
     r'I[lL]*[eE]*.*': 'ILLE Perot'} 
} 

df.replace(replacements, regex=True, inplace=True) 

print(df) 

wyjściowa:

SURNAME   ADDRESS     CITY 
0 Jenson 252 Des Chênes DOLLARD-DES-ORMEAUX 
1  Jean   236 Gouin DOLLARD-DES-ORMEAUX 
2  Denis 993 Boul. Gouin DOLLARD-DES-ORMEAUX 
3 Bradford 1690 Dollard #7 DOLLARD-DES-ORMEAUX 
4 Alisson 115 Du Buisson   ILLE Perot 
5  Abdul 9877 Boul. Gouin   Pierrefonds 
6 O'Neil  5 Du College   ILLE Perot 
7  Bundy 7345 Sherbrooke   ILLE Perot 
8  Darcy 8671 Anthony #2   ILLE Perot 
9  Adams  845 Georges   Pierrefonds 
2

Można utworzyć słownika zamienia, a następnie iteruje za ich pomocą, używając "loc" do wymiany.

target_for_values = { 
    'DOLLARD-DES-ORMEAUX': ['D.DO', 'DOLLARD', 'DDO'], 
    'ILE-PERROT': ['IL PERROT', 'ILLE PEROT', 'ILE PERROT']} 

for k, v in target_for_values.iteritems(): 
    df.loc[df.CITY.str.upper().isin(v), 'CITY'] = k 

>>> df.CITY 
        CITY 
0     C.DO 
1 DOLLARD-DES-ORMEAUX 
2 DOLLARD-DES-ORMEAUX 
3 DOLLARD-DES-ORMEAUX 
4   ILE-PERROT 
5   Pierrefonds 
6   Ile Bizard 
7   ILE-PERROT 
8   ILE-PERROT 
9   Pierrefonds 
Powiązane problemy