Вставить новый столбец в Pandas на основе элемента, найденного через BeautifulSoup - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть датафрейм, который состоит из таблиц. Количество столов может быть от 3 до 6 и меняется ежедневно. Я вырезал детали, но вот как выглядит HTML. Существует заголовок таблицы с именем «list-title» и список строк таблицы с именем «list2», которые я успешно извлек через pandas.


<span id="list-title">
ABC(11111)
<br>
</span

<table class="list2">
<tbody>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
</tbody>
</table>

<span id="list-title">
DEF(22222)
<br>
</span>

<table class="list2">
<tbody>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
</tbody>
</table>

<span id="list-title">
XYZ(33333)
<br>
</span>

<table class="list2">
<tbody>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
  <tr class = "bg3" </tr>
</tbody>
</table>

Я использовал следующий код для извлечения таблиц и объединил в одну большую таблицу.

import pandas as pd
from bs4 import BeautifulSoup


filename = r'\\server\user\someone\Desktop\test.html'
path = open(filename, 'r')
destination = r"\\server\user\someone\Desktop\test_result.xlsx"

soup = BeautifulSoup(open(filename), 'html.parser')
df = pd.io.html.read_html(filename, encoding='Shift JIS', attrs={'class':'list2'})

df = pd.concat(df)

#remove all rows containing Total
df = df[df.isin({'Total'}).sum(1) == 0]

#Even Rows
df_tmp1 = df.iloc[::2].reset_index(drop=True)
df_tmp1.columns = df.columns.get_level_values(0)

# Odd Rows
df_tmp2 = df.iloc[1::2].reset_index(drop=True)
df_tmp2.columns = df.columns.get_level_values(1)

Что мне нужно сделать, это создать новый столбец и экспортировать информация из "списка-заголовка" в таблице.


broker = soup.find('div', id='mainContents').find_all(id='list-title')[1]
broker = broker.get_text()
df = pd.concat([df_tmp1, df_tmp2], axis=1)
df.insert(5, 'New_Column', broker)

Что делает код выше, так это то, что он добавляет второй заголовок как «брокер» для всех таблиц, а не для каждой таблицы. Я пытался использовать для таких циклов, как

for i in range(3):
    df = df[i] = pd.io.html.read_html(filename, encoding='Shift JIS', attrs={'class': 'list2'})
    broker = soup.find('div', id='mainContents').find_all(id='list-title')[i]
    broker = broker.get_text()
    df.insert(5, 'New_Column, broker)

, но это вызывает ошибку. Я думаю, что мне нужно вставить столбец, прежде чем я объединю таблицы, но не знаю, как это сделать.

1 Ответ

1 голос
/ 27 февраля 2020

Похоже, вам просто нужно l oop импортированных таблиц и брокеров и добавить столбец брокера к каждому фрейму данных перед объединением:

tables = pd.io.html.read_html(filename, encoding='Shift JIS', attrs={'class':'list2'})
brokers = soup.find('div', id='mainContents').find_all(id='list-title')

for (t, b in zip(tables, brokers)):
    t['broker'] = b.get_text()

df = pd.concat(df)

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...