#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 части. Он упомянул в самом вопросе.