Home > Blockchain >  Replace substring by substring in column of data frame
Replace substring by substring in column of data frame

Time:11-05

I have a pandas data frame data with several columns. One of these columns is GEN. This column contains german cities as strings. Some of these cities are in a bad format, meaning that they have values like "Frankfurt a.Main". For every element in data['GEN'] I would like to replace every expression of the form "\.[A-ZÄÖÜ]" (i.e. dot followed by upper case letter) by the corresponding expression "\.\b[A-ZÄÖÜ]". For example

  • "Frankfurt a.Main" becomes "Frankfurt a. Main"
  • "Frankfurt a.d.Oder" becomes "Frankfurt a.d. Oder" and so on.

I am pretty sure that pandas.Series.str.contains and pandas.Series.str.replace are helpful here, but one of my problems is that I don't know how to put the replacement task in a form that can be used by the above functions.

CodePudding user response:

You can use pandas.Series.str.replace to capture the two groups that compose a german city name in your original data and then add a whitespace between them.

Try this :

data['GEN'] = data['GEN'].str.replace(r'(\w \s.*\.)(\w*)', r'\1 \2', regex=True)

# Output :

0      Frankfurt a. Main
1    Frankfurt a.d. Oder

CodePudding user response:

You could assert a dot to the left using a positive lookbehind (?<=\.) and match one of [A-ZÄÖÜ]

In the replacement use a space followed by the full match using \g<0>

import pandas as pd

pattern = r"(?<=\.)[A-ZÄÖÜ]"
items = [
    "Frankfurt a.Main",
    "Frankfurt a.d.Oder"
]
data = pd.DataFrame(items, columns=["GEN"])
data['GEN'] = data['GEN'].str.replace(pattern, r' \g<0>')
print(data)

Output

                   GEN
0    Frankfurt a. Main
1  Frankfurt a.d. Oder
  • Related