#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