В панд разделите столбец на 2 в зависимости от внешнего вида —

#pandas #string #data-manipulation

Вопрос:

У нас есть

 import pandas as pd
df = pd.DataFrame({'open': ['-2.5 2.5', ' 3-3', '-1.5 1.5', '-1 1', ' 3.5-3.5', 'PKPK']})
 

введите описание изображения здесь

И нам нужно разделить эту колонку, чтобы получить:

 pd.DataFrame({
    'open1': ['-2.5', ' 3', '-1.5', '-1', ' 3.5', 'PK'],
    'open2': [' 2.5', '-3', ' 1.5', ' 1', '-3.5', 'PK']
})
 

Ответ №1:

Попробуйте использовать (?=d) утверждения lookahead и (?<=d) lookbehind. Они не потребляют символы после разделения. Добавьте [ -] регулярное выражение в lookahead и используйте | ИЛИ для решения проблем с PKPK.

 import pandas as pd
df = pd.DataFrame({'open': ['-2.5 2.5', ' 3-3', '-1.5 1.5', '-1 1', ' 3.5-3.5', 'PKPK']})
df=df['open'].str.split('(?<=[d]|K)(?=[ -]|P)', expand=True)
 

введите описание изображения здесь

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

1. приносим извинения за корректировку вопроса, но, пожалуйста, смотрите правку. заметил две проблемы (1) 2 — й — отброшен, и (2) PKPK не разделен

Ответ №2:

Это работает так, потому что вы дали d своему шаблону регулярных выражений, и он не будет работать для float. Например, когда у вас 2,5 — требуется 2, а затем он видит точку.

Вы могли бы рассмотреть возможность изменения шаблона, чтобы найти как плавающие, так и целые числа:

 output_df = pd.DataFrame({'open': ['-2.5 2.5', ' 3-3', '-1.5 1.5', 
                                   '-1 1', ' 3.5-3.5', 'PKPK']})

output_df['open'].str.extractall(r'([- ]?d*.d |[- ]?d |PK )').unstack()
 

Выход:

                 0
match     0     1
    0  -2.5   2.5
    1     3    -3
    2  -1.5   1.5
    3    -1     1
    4   3.5  -3.5
    5    PK    PK