Вы можете использовать df.replace
следующим образом:
import pandas as pd
df = pd.DataFrame({'Player':['Roddick Andy', 'Federer Roger', 'Tsonga Jo Wilfred']})
df = df.replace(r'(?<=\s\w)\w+\s?', value = '.', regex = True)
print(df)
Регулярное выражение: (?<=\s\w)\w+\s?
\w+
- соответствует любому символу слова хотя бы единице (?<=\s\w)
- Положительный вид сзади (перед первым шагом должен стоять один пробел и любой отдельный символ слова \s?
- За первым шагом следует дополнительный пробел.
Результаты:
Player
0 Roddick A.
1 Federer R.
2 Tsonga J.W.
РЕДАКТИРОВАТЬ:
Вариант 1:
Чтобы поменять местами два инициала, мы могли бы (сохранить идея использования регулярных выражений) добавьте еще df.replace
, со вторым регулярным выражением.
import pandas as pd
df = pd.DataFrame({'Player':['Roddick Andy', 'Federer Roger', 'Tsonga Jo Wilfred']})
df = df.replace(r'(?<=\s\w)\w+\s?', value = '.', regex = True)
df = df.replace(r'(.(?=\.)\.)(.(?=\.)\.)?', value = r'\2\1', regex = True)
print(df)
Регулярное выражение: (.(?=\.)\.)(.(?=\.)\.)?
(.(?=\.)\.)
- Группа захвата 1: сопоставить любой символ (.
), за которым следует (положительный взгляд) буквальную точку, включая сопоставление с точкой. (.(?=\.)\.)?
- Группа захвата 2: необязательный (?
) захват g группа, совпадающая с тем же шаблоном, что и группа захвата 1.
Выше не очень динамично c. Но он будет работать нормально, если есть максимум две инициалы. Также возможно добавить его довольно легко, однако нижеприведенная опция будет более динамичной c.
Опция 2:
До Вы продолжаете, могу ли я упомянуть, что я довольно новичок в Python
, поэтому я уверен, что то, что я сделал здесь, может быть сокращено / сделано намного проще.
Идея в том, чтобы split
и дополнить фрейм данных, затем переверните все, кроме первого столбца, затем join
затем верните их обратно в один столбец в фрейме данных, где мы затем можем применить df.replace
.
import pandas as pd
df = pd.DataFrame({'Player':['Roddick Andy', 'Federer Roger', 'Tsonga Jo Wilfred']})
df = df.Player.str.split(None, expand=True).iloc[:, ::-1]
df = df[[list(df.columns)[-1]] + list(df.columns)[:-1]]
df = df[df.columns[0:]].apply(lambda x: ' '.join(x.dropna().astype(str)), axis=1)
df = df.replace(r'(?<=\s\w)\w+\s?', value = '.', regex = True)
print(df)
Результаты:
Player
0 Roddick A.
1 Federer R.
2 Tsonga W.J.