#python #regex #pandas
Вопрос:
У меня есть довольно большой CSV-файл, содержащий несколько столбцов (без разделителей) и один столбец, содержащий результаты, в которых используются три разделителя.
Основным разделителем является «;», который разделяет дни результатов.
Второй разделитель -«:», который разделяет результаты за день (я использую только 2 результата из 6 возможных).
Третьим разделителем является «/», который разделяет день результата и календарное значение результата.
Я хочу, чтобы как можно больше не зацикливаться на столбце «Xamp;Y», так как сам столбец содержит много результатов с разделителями и в нем много строк.
Col1 | Col2 | Xamp;Y |
---|---|---|
A | B | 20200331/1D::::1:2;20200401/2D::::3:4;20200402/3D::::5:6 |
aa | бб | 20210330/1 ГОД::::11:22;20220330/2Y::::33:44;20230330/3Y::::55:66 |
Я хочу видеть:
Col1 | Col2 | Дата | Значение календаря | X | Y |
---|---|---|---|---|---|
A | B | 20200331 | 1D | 1 | 2 |
A | B | 20200401 | 2D | 3 | 4 |
A | B | 2020040 | 3D | 5 | 6 |
aa | бб | 20210330 | 1Y | 11 | 22 |
aa | бб | 20220330 | 2Y | 33 | 44 |
aa | бб | 20220330 | 3Y | 55 | 66 |
import pandas as pd
df = pd.DataFrame({'Col1':['A','AA'], 'Col2':['B', 'BB'], 'Col3':['20200331/1D::::1:2;20200401/2D::::3:4;20200402/3D::::5:6','20210330/1Y::::11:22;20220330/2Y::::33:44;20230330/3Y::::55:66']})
Ответ №1:
Вот решение, которое вы можете попробовать, разделить на основе разделителя (;)
, а затем explode
преобразовать в строки. Затем extract
и, наконец concat
, кадры, чтобы получить результирующий кадр.
import pandas as pd
import re
df = pd.DataFrame({'Col1': ['A', 'AA'], 'Col2': ['B', 'BB'],
'Col3': ['20200331/1D::::1:2;20200401/2D::::3:4;20200402/3D::::5:6',
'20210330/1Y::::11:22;20220330/2Y::::33:44;20230330/3Y::::55:66']})
df['Col3'] = df['Col3'].str.split(";")
# extract features from the string
extract_ = re.compile(r"(?P<Date>w )/(?P<CalendarValue>w ): (?P<X>. ):(?P<Y>. )")
pd.concat([
df.drop(columns='Col3'),
df['Col3'].explode().str.extract(extract_, expand=True)
], axis=1)
Out[*]:
Col1 Col2 Date CalendarValue X Y
0 A B 20200331 1D 1 2
0 A B 20200401 2D 3 4
0 A B 20200402 3D 5 6
1 AA BB 20210330 1Y 11 22
1 AA BB 20220330 2Y 33 44
1 AA BB 20230330 3Y 55 66
Комментарии:
1. Привет сушант, результат идеален, однако я должен указать, что значения «Xamp;Y» могут быть плавающими числами, не могли бы вы разработать решение, которое может обрабатывать как целые числа, так и плавающие числа? df = pd.Фрейм данных({‘Col1’: [‘A’, ‘AA’], ‘Col2’: [‘B’, ‘BB’], ‘Col3’: [‘20200331/1D::::1.2:2.2;20200401/2D::::3:4;20200402/3D::::5:6’, ‘20210330/1Y::::11.5:22;20220330/2Y::::33:44;20230330/3Y::::55:66’]})
2. Привет сушант, еще раз спасибо, что вы решили проблему, о которой я просил. Снова у меня проблема со значениями календаря, иногда там содержатся значения дефиса и некоторые значения календаря, содержащие «/». Не могли бы вы решить эту проблему как для дефисных, так и для не дефисных значений календаря df = pd.Фрейм данных({‘Col1’:[‘A’,’AA’], ‘Col2’:[‘B’, ‘BB’], ‘Col3’:[‘20200331/1D::::1.1:2.5;20200401/2D::::3:4;20200402/12M-15M::::-5.5:-6.56′,’20210330/O/N::::11.23:-22;20220330/JUN-21::::33:44;20230330/SEP-21::::-55.23:66’]})
3. @FOS5252, так что это не служба написания кода.. Пожалуйста, примите это сообщение, если оно отвечает на вопрос, и для дальнейших запросов, пожалуйста, откройте новый вопрос.