#pandas #dataframe #split
#pandas #фрейм данных #разделение
Вопрос:
У меня есть фрейм данных со столбцом адресов, как показано ниже. Я хотел бы разделить этот столбец таким образом, чтобы страны, города и учреждения были разделены на разные столбцы. Сложность заключается в том, что каждая ячейка имеет разную структуру. Общим для всех этих ячеек является то, что они заканчиваются на city, country, но в некоторых ситуациях, таких как индекс строки 3, есть несколько записей.
id address
------------------------------------------------------------------------------------------------
0 223 Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
1 223 Department of Surgery, University Hospital Maastricht, Maastricht, The Netherlands; NUTRIM School for Nutrition, Toxicology and Metabolism, Maastricht University, Maastricht, The Netherlands
2 223 Department of Surgery, University Hospital Maastricht, Maastricht, The Netherlands; NUTRIM School for Nutrition, Toxicology and Metabolism, Maastricht University, Maastricht, The Netherlands
3 223 Department of Surgery, Närebro University Hospital, Närebro; Department of Molecular Medicine and Surgery, Karolinska Institutet, Stockholm, Sweden'}, {'id': '9900', 'name': 'Närebro universitet, Institutionen för läkarutbildning
4 223 Clinical Surgery, University of Edinburgh, Royal Infirmary of Edinburgh, Edinburgh, UK
5 223 Division of Gastrointestinal Surgery, Nottingham Digestive Diseases Centre, National Institute for Health Research, Biomedical Research Unit, Nottingham University Hospitals, Queen's Medical Centre, Nottingham, UK
6 223 Hospital of Lausanne (CHUV), Lausanne, Switzerland
7 223 Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
8 223 Clinical Surgery, University of Edinburgh, Royal Infirmary of Edinburgh, Edinburgh, UK
9 223 Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
кто-нибудь может помочь здесь, пожалуйста?
Обратите внимание, что приведенный выше фрейм данных является подмножеством моего фрейма данных, и именно поэтому столбец id имеет одинаковые значения для всех строк. Исходный фрейм данных содержит около 10 тыс. строк, и поэтому он не может поделиться им здесь.
Комментарии:
1. Вы могли бы составить список со всеми странами, другой список с городами, а затем вы могли бы использовать регулярное выражение для извлечения правильной строки. Остальной частью строки будут учреждения.
2. ваша логика кажется разумной. можете ли вы предоставить свой фрагмент кода?
3. Здесь можно использовать распознавание именованных объектов .
Ответ №1:
Вероятно, это слишком упрощенно для вашей базы данных из 10 тысяч строк, но, надеюсь, это поможет вам в правильном направлении.
Обратите внимание, что индекс строки 3 неверно сформирован, поскольку он имеет фигурные скобки и т. Д. — Похоже на проблемы с синтаксическим анализом при создании / очистке ваших данных. В приведенном ниже примере это игнорируется, на практике вы хотите очистить свои входные данные или устранить проблему выше.
Сначала я создаю набор данных игрушек из ваших данных:
import pandas as pd
from io import StringIO
raw_data = StringIO(
"""
!Id!address
0!223!Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
1!223!Department of Surgery, University Hospital Maastricht, Maastricht, The Netherlands; NUTRIM School for Nutrition, Toxicology and Metabolism, Maastricht University, Maastricht, The Netherlands
2!223!Department of Surgery, University Hospital Maastricht, Maastricht, The Netherlands; NUTRIM School for Nutrition, Toxicology and Metabolism, Maastricht University, Maastricht, The Netherlands
3!223!Department of Surgery, Närebro University Hospital, Närebro; Department of Molecular Medicine and Surgery, Karolinska Institutet, Stockholm, Sweden'}, {'id': '9900', 'name': 'Närebro universitet, Institutionen för läkarutbildning
4!223!Clinical Surgery, University of Edinburgh, Royal Infirmary of Edinburgh, Edinburgh, UK
5!223!Division of Gastrointestinal Surgery, Nottingham Digestive Diseases Centre, National Institute for Health Research, Biomedical Research Unit, Nottingham University Hospitals, Queen's Medical Centre, Nottingham, UK
6!223!Hospital of Lausanne (CHUV), Lausanne, Switzerland
7!223!Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
8!223!Clinical Surgery, University of Edinburgh, Royal Infirmary of Edinburgh, Edinburgh, UK
9!223!Department of GI and HPB Surgery, University Hospital Northern Norway, Breivika, Tromsø, Norway; Institute of Clinical Medicine, University of Tromsø, Tromsø, Norway
""")
data = pd.read_csv(raw_data, index_col=0, delimiter='!')
Далее, для строк с несколькими адресами я разделяю и помещаю их в отдельные строки в фрейме данных. Я предполагаю, что они всегда разделяются символом «;», как в вашем примере
data['address'] = data['address'].str.split(';')
data = data.explode('address')
Затем я обозначаю адрес, разделяя его на ‘,’. Здесь address_tokens
столбец будет содержать списки токенов после этого
data['address_tokens'] = data['address'].str.split(',')
Теперь для каждой строки мы объединяем токены в список из трех элементов, содержащих [токены [0: N-3], соединенные запятой, токен [N-2], токен [N-1]], и мы идентифицируем их как учреждение, город, страна
data['address_3'] = data['address_tokens'].apply(lambda tks: [','.join(tks[:-3]), tks[-2], tks[-1]] )
data[['institution', 'city', 'country']] = data['address_3'].apply(pd.Series)
Я сохранил все промежуточные шаги в dataframe, чтобы вы могли видеть результаты. Три столбца ['institution', 'city', 'country']
содержат то, что вы просили, за исключением некоторых проблем с {,} и т.д., исходящих из исходного индекса строки 3