Преобразование данных в series
Столкнулся с такой проблемой, после парсинга сайта, объект Series получил данные в таком формате
296 Чемпионат Украины. Высшая лига Университет Старый Луцк - Говерла (с ОТ) 09.03 12:45 [82:76 (26:23,18:20,11:14,27:19)]
297 Чемпионат Украины. Первая лига Днепр-3 ДВУФК-СДЮСШОР-5 - Университет Харьков ... 09.03 12:00 [84:75 (27:17,27:22,16:23,14:13)]
298 Чемпионат Финляндии Нокия - Каухайоен Карху (с ОТ) 09.03 19:30 [63:87 (17:23,18:16,15:27,13:21)]
299 Чемпионат Чили Универсидад Католика - Пуэнто-Альто (с ОТ) 09.03 00:00 [72:81 (23:22,13:21,10:16,26:22)]
300 Чемпионат Чили АБ Темуко - Универсидад де Консепсьон (с ОТ) 09.03 01:00 [86:100 (15:24,26:30,23:24,22:22)]
301 Чемпионат Чили АБА Анкуд - Лас-Анимас (с ОТ) 09.03 02:00 [65:76 (19:15,17:14,18:20,11:27)]
302 Чемпионат Чили Депортес Кастро - Атлетико ПТО Варас (с ОТ) 09.03 02:00 [80:76 (17:16,23:16,19:20,21:24)]
303 Чемпионат Чили Депортиво Вальдивия - ЦЕБ Пуэрто-Монт (с ОТ) 09.03 02:00 [79:84 (28:23,15:14,23:23,13:24)]
304 Чемпионат Южной Кореи. Женщины Шинхан Сибёрдз (жен) - Кеб Ханабанк (жен) (с ОТ) 09.03 13:00 [79:84 (19:22,15:22,18:24,27:16)]
Пробовал преобразовать данные, .split, int(), str(). Всегда выдает ошибку SyntaxError, указывая на первое ":". Подскажите, как можно преобразовать данные, чтобы над ними можно было работать (значения в () в отдельную series, и сравнивать их).
url = 'https://1xstavka.ru/results/getmain'
params = {'showAll': 'true', 'date': '2020-03-09'}
headers = {'X-Requested-With': 'XMLHttpRequest'}
response = requests.get(url, params=params, headers=headers)
r = response.json()
score =[]
basket = r['results'][1]['Elems']
for i in basket:
for j in i['Elems']:
score.append(j)
with open('response.json', 'w', encoding='utf-8') as file:
json.dump(score, file, indent=2, ensure_ascii=False)
df = pd.read_json('response.json')
basketball = df[['champName', 'nameGame', 'date', 'scores']
print(basketball.scores)
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Если я правильно понял вопрос:
Исходные:
import pandas as pd
a = ['[2453:0 (2453:0)]','[0:0 (0:0)]','[103:112 (25:27,28:22,28:36,22:27)]',
'[107:120 (29:36,34:35,21:27,23:22)]', '[86:100 (15:24,26:30,23:24,22:22)]',
'[65:76 (19:15,17:14,18:20,11:27)]', '[80:76 (17:16,23:16,19:20,21:24)]',
'[79:84 (28:23,15:14,23:23,13:24)]','[79:84 (19:22,15:22,18:24,27:16)]']
s = pd.Series(a)
s, соответственно, получается:
0 [2453:0 (2453:0)]
1 [0:0 (0:0)]
2 [103:112 (25:27,28:22,28:36,22:27)]
3 [107:120 (29:36,34:35,21:27,23:22)]
4 [86:100 (15:24,26:30,23:24,22:22)]
5 [65:76 (19:15,17:14,18:20,11:27)]
6 [80:76 (17:16,23:16,19:20,21:24)]
7 [79:84 (28:23,15:14,23:23,13:24)]
8 [79:84 (19:22,15:22,18:24,27:16)]
dtype: object
Дальше:
res = s.str.extract(r'\((.+?)\)')
res - датафрейм с нужными вам данными:
0
0 2453:0
1 0:0
2 25:27,28:22,28:36,22:27
3 29:36,34:35,21:27,23:22
4 15:24,26:30,23:24,22:22
5 19:15,17:14,18:20,11:27
6 17:16,23:16,19:20,21:24
7 28:23,15:14,23:23,13:24
8 19:22,15:22,18:24,27:16
<class 'pandas.core.frame.DataFrame'>
Если нужно разбить и эту серию на интервалы, тогда добавьте:
res = res[0].str.split(",", expand=True)
тогда res будет
0 1 2 3
0 2453:0 None None None
1 0:0 None None None
2 25:27 28:22 28:36 22:27
3 29:36 34:35 21:27 23:22
4 15:24 26:30 23:24 22:22
5 19:15 17:14 18:20 11:27
6 17:16 23:16 19:20 21:24
7 28:23 15:14 23:23 13:24
8 19:22 15:22 18:24 27:16
UPDATE
После уточнения условий:
res = s.str.extract(r'^\[(?P<общий_итог>\S+?)\s\((.+?)\)')
res = pd.concat([res['общий_итог'], res[1].str.split(",", expand=True)], axis=1)
def make_eq(a: str) -> str:
if a is not None:
num = [int(x) for x in a.split(':')]
sign='<' if num[1] > num[0] else '>'
return f"{num[0]}{sign}{num[1]}"
return None
res[[0,1,2,3]] = res[[0,1,2,3]].applymap(make_eq)
Тогда res получится:
общий_итог 0 1 2 3
0 2453:0 2453>0 None None None
1 0:0 0>0 None None None
2 103:112 25<27 28>22 28<36 22<27
3 107:120 29<36 34<35 21<27 23>22
4 86:100 15<24 26<30 23<24 22>22
5 65:76 19>15 17>14 18<20 11<27
6 80:76 17>16 23>16 19<20 21<24
7 79:84 28>23 15>14 23>23 13<24
8 79:84 19<22 15<22 18<24 27>16