#python #pandas #dataframe #wikipedia
#python #pandas #фрейм данных #википедия
Вопрос:
У меня есть скрипт, который использует Beautiful Soup для извлечения таблицы Википедии из указанной статьи, а затем я вставляю эту таблицу в фрейм данных Python. Проблема возникает из-за форматирования Википедии, где HTML не возвращает общие значения в каждой строке, поэтому, когда две последовательные строки имеют одинаковое значение в столбце, возвращается только первый экземпляр.
Результатом является вывод, аналогичный приведенному ниже.
Date | Random Field | State | Random Field | Source
Friday, June 1st | text | WY | text | [12]
text | text | [13] | NaN | NaN
Friday, June 8th | text | VT | text | [14]
text | CA | text | [15] | NaN
Во второй строке эта запись содержит как дату, так и состояние, что приводит к двум значениям NaN в конце. В четвертой строке эта запись имеет только значение даты.
Цель состоит в том, чтобы перебрать фрейм данных, находя значения для даты и состояния, которые не соответствуют ожидаемым (т.Е. Не Dayofweek, Month # для даты или XY для состояния), и при обнаружении аномалий скопируйте значение сверху и соответствующим образом сдвиньте ячейки, чтобы вернуть вывод следующим образом.
Date | Random Field | State | Random Field | Source
Friday, June 1st | text | WY | text | [12]
Friday, June 1st | text | WY | text | [13]
Friday, June 8th | text | VT | text | [14]
Friday, June 8th | text | CA | text | [15]
Я не уверен, возможно ли это, не говоря уже об эффективности. Я знаю, что мог бы сделать это в Excel, но предпочел бы оставаться в Python для удобства построения конвейера обработки, когда может потребоваться больше таблицы.
Большое спасибо за любые рекомендации!
Редактировать: по запросу ниже добавляется подробная информация о том, как был создан фрейм данных, на случай, если это поможет.
with io.open('Wiki article', "w", encoding="utf-8") as f:
f.write(article)
for caption in soup.find_all('caption'):
if "CAPTION TEXT" in caption.get_text():
ths = table.find_all('th')
headings = [th.text.strip() for th in ths]
table = caption.find_parent('table')
df = pd.read_html(str(table))
df = pd.DataFrame(df[0])
Комментарии:
1. В этом вопросе могут использоваться функции, которые вы используете для преобразования из beautifulsoup в pandas df, чтобы мы могли помочь! Я ожидаю, что это больше связано с конкретной функцией, используемой для преобразования в фрейм данных, а не с самим фреймом данных pandas (для фреймов данных не должно быть никаких внутренних ограничений, если вы не используете этот столбец в качестве индекса). Это можно легко обойти, назначив свой собственный индекс (например, i = 0,1,2 …), Но это может потребоваться при преобразовании
2. Только что добавлены функции для выполнения шагов от загрузки статьи до ее сканирования с помощью BeautifulSoup и загрузки в фрейм данных. Таблицы Википедии используют rowspan для значений столбцов, общих для строк, как видно из таблицы здесь: en.wikipedia.org/wiki/The_Getaway_World_Tour#Tour_dates