2017-01-04 11 views
10

Po prostu uczę się Pythona/Pand i jak bardzo jest potężny i zwięzły.Używanie grup dopasowanych do wyrażenia regularnego w pandach Dataframe zastępuje funkcję

Podczas czyszczenia danych chcę użyć zamiany na kolumnie w ramce danych za pomocą wyrażenia regularnego, ale chcę ponownie wstawić części dopasowania (grupy).

Prosty przykład: Nazwisko, imię -> Imię Nazwisko

Próbowałem coś jak następuje (rzeczywista sprawa jest bardziej skomplikowana, więc przepraszam prostego wyrażenia regularnego):

df['Col1'].replace({'([A-Za-z])+, ([A-Za-z]+)' : '\2 \1'}, inplace=True, regex=True) 

Jednak Skutkuje puste wartości. Część dopasowania działa zgodnie z oczekiwaniami, ale część wartości nie. Myślę, że można to osiągnąć przez pewne dzielenie i łączenie, ale szukam ogólnej odpowiedzi, czy grupa regex może być używana w zamian.

+1

Proszę podzielić się jakieś dane do testów. – Abdou

+0

lub 'df ['Col1']. Replace ({'([A-Za-z] +), ([A-Za-z] +)': '\\ 2 \\ 1'}, inplace = True , regex = True) '. – Abdou

+0

Naprawdę świetnie! Po prostu uczenie się Pythona, więc proszę przepraszam za błąd początkującego. Dodatkowe pytanie: Czy oba sposoby transmisji są nadawane, tj. Czy oba są szybkie, czy to przez .str, czy za pomocą metody replace() bezpośrednio? –

Odpowiedz

7

myślę, że masz kilka problemów z regex jest.

Jak @Abdou just said użycia albo '\\2 \\1' lub lepszej r'\2 \1', jak '\1' jest symbolem z kodu ASCII 1

Twoje rozwiązanie powinno działać, jeśli użyjesz poprawne RegEx na:

In [193]: df 
Out[193]: 
       name 
0  John, Doe 
1 Max, Mustermann 

In [194]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1'}, regex=True) 
Out[194]: 
0   Doe John 
1 Mustermann Max 
Name: name, dtype: object 

In [195]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1', 'Max':'Fritz'}, regex=True) 
Out[195]: 
0   Doe John 
1 Mustermann Fritz 
Name: name, dtype: object 
+0

Dziękuję, szczególnie za miłe wyjaśnienie, jak działa Python regex. Większość przykładów, które widziałem są tak proste, że można pominąć składnię r bez problemów, jak się wydaje. –

5

setup

df = pd.DataFrame(dict(name=['Smith, Sean'])) 
print(df) 

      name 
0 Smith, Sean 

użyciu replace

df.name.str.replace(r'(\w+),\s*(\w+)', r'\2 \1') 

0 Sean Smith 
Name: name, dtype: object 

użyciu extract
podzielono na dwie kolumny

df.name.str.extract('(?P<Last>\w+),\s*(?P<First>\w+)', expand=True) 

    Last First 
0 Smith Sean 
+0

Dzięki dla dodatkowych informacji na temat extract(), piRSquared. Oznaczyłem odpowiedź przez MaxU dla dodatkowej wskazówki na temat błędu newbie z regex. –

+0

@PeterD bez problemu. Odpowiedź MaxU jest świetna – piRSquared

Powiązane problemy