Разделить столбец фрейма данных pandas на 2 с помощью регулярного выражения

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть такой набор данных, и я хочу разделить столбец name на 2 столбца, где столбец Name перезаписывается как «имя и фамилия», а столбец «среднее имя» содержит только среднее имя, включая скобки.

 In [1]: dd = {'Name' : ['Daniel [Jack] Horn', 'Marcus [Martin] Dwell', 'Greg [Alex] Waltz']}

In [2]: dd_frame = pd.DataFrame(dd)

In [3]: dd_frame
Out[3]: 
                    Name
0     Daniel [Jack] Horn
1  Marcus [Martin] Dwell
2      Greg [Alex] Waltz
 

Ожидаемый результат

              Name    MiddleName
0     Daniel Horn        [Jack]  
1    Marcus Dwell      [Martin]
2      Greg Waltz        [Alex]
 

Каким был бы простой способ сделать это без разделения на 3 столбца и объединения 1-го и 3-го?

Комментарии:

1. Если какой-либо ответ поможет. Закройте ответ, приняв этот ответ.

Ответ №1:

Попробуйте использовать регулярное выражение:

 df = dd_frame
df['Middle Name'] = df['Name'].str.extract(r"[(.*)]")
df['Name'] = df['Name'].str.replace(r"s [(.*)]", "")
 

     Name            Middle Name
0   Daniel Horn     Jack
1   Marcus Dwell    Martin
2   Greg Waltz      Alex
 

Ответ №2:

 df["Middle Name"] = df.Name.apply(lambda x: x.split(" ")[1][1:-1])


                Name      Middle Name
0   Daniel [Jack] Horn       Jack
1   Marcus [Martin] Dwell   Martin
2   Greg [Alex] Waltz        Alex
 

Безусловно, это худший способ делать то, что вы хотите, но он работает… Сначала он разделяет ваше имя на " " (пробел). Тогда средний элемент списка — это ваше имя. Затем мы берем то, что находится между скобками. Если вы хотите сохранить скобки, удалите [1:-1]

 df["Midname"] = df.Name.apply(lambda x: re.findall(r'[[^]]*]',x)[0])

#output

          Name           Middle Name    MidName
0   Daniel [Jack] Horn      Jack        [Jack]
1   Marcus [Martin] Dwell   Martin      [Martin]
2   Greg [Alex] Waltz       Alex        [Alex]
 

Однако при этом используется регулярное выражение, я не эксперт в регулярных выражениях. findall , собирает ваши ответы в скобках, поэтому вам нужно взять первый элемент в этом списке, чтобы избежать [[Jack]]

Ответ №3:

Дополнение к отличным ответам, используя string.split :

 extracts = [(f"{first}{last}", middle)
             for first, middle, last in 
             dd_frame.Name.str.split("([. ])")]

pd.DataFrame(extracts, columns=["Name", "MiddleName"])

        Name      MiddleName
0   Daniel Horn      [Jack]
1   Marcus Dwell    [Martin]
2   Greg Waltz      [Alex]
 

Ответ №4:

Вот как вы можете это сделать!

 split = dd_frame['name'].split()
dd_frame['name'] = split[0]   split[1]
dd_frame['MiddleName'] = split[1]
 

Комментарии:

1. OP не хочет разделяться на 3 части. Он упомянул в самом вопросе.