Панды Python: извлекают данные из ячейки и превращают их в столбец

#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