#python #pandas
Вопрос:
У меня несколько перепутанный набор данных с этим шаблоном:
ID Value
abc (john:10),(albert:5),(hanna:7) ...
def (frank:5),(dave:8),(ben:11) ...
Я, конечно, предпочел бы иметь эти данные в таком формате:
ID Value1 Value2
abc john 10
abc albert 5
abc hanna 7
def frank 5
def dave 8
def ben 11
Однако я несколько застрял в вопросе о том, как это сделать?
Единственное решение, которое я мог придумать, — это перебрать и добавить очень новую точку данных в новый фрейм данных.
Может быть, есть лучший и более эффективный подход?
Спасибо!
Ответ №1:
str.extractall
Мы можем извлечь все вхождения шаблона регулярного выражения из строк в столбце Value
df.set_index('ID')['Value'].str.extractall(r'((w ):(d ))').droplevel(1)
0 1
ID
abc john 10
abc albert 5
abc hanna 7
def frank 5
def dave 8
def ben 11
Сведения о регулярном выражении:
(
: Соответствует персонажу(
буквально(w )
: Первая группа захватаw
: Соответствует одному или нескольким символам слова
:
: Соответствует персонажу:
буквально(d )
: Вторая группа захватаd
: Соответствует одной или нескольким цифрам
)
: Соответствует персонажу)
буквально
Смотрите онлайн-демонстрацию регулярных выражений
Ответ №2:
Вы можете использовать explode
и str.extract
:
df = df.assign(Value = df.Value.str.split(',')).explode('Value')
df[['Value_1', 'Value_2']] = df.Value.str.extract(pat=r'((w ):(d ))')
df = df.drop('Value', axis =1)
выход:
ID Value_1 Value_2
0 abc john 10
0 abc albert 5
0 abc hanna 7
1 def frank 5
1 def dave 8
1 def ben 11