Как исправить таблицу Википедии, перенесенную в фрейм данных Python

#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