Как я могу создать заголовки и столбцы в пандах из набора данных? - PullRequest
0 голосов
/ 03 июля 2018

Я знаю, как жестко кодировать имена заголовков, но мне нужно сгенерировать их из моего массива. Возможно ли это?

Мои данные динамически очищаются, поэтому я не могу жестко закодировать свои заголовки или столбцы

results_headings содержит строки, такие как Animal, Mineral, Vegetable

results_columns содержит строки, такие как Bear, Quartz, Brocolli

Мой код

#Imports
from bs4 import BeautifulSoup
import requests
import pandas as pd 

#Specify URL & Assign to page object
url = 'http://www.example.com'
page = requests.get(url)

#Grab our page as text
page.text   
soup = BeautifulSoup(page.text, 'html.parser')   #Use the HTML Parser

#Find our information
boxinfo = soup.find("div", {"id": "box1"})
headings = boxinfo.find_all("td", {"class": "label"})
columns = boxinfo.find_all("td")

#Get the headings
results_headings = []
for result in headings:
    result_NoHTML = result.getText()
    results.append(result_NoHTML)

#Get the columns
results_columns = []
for result2 in columns:
    result2_NoHTML = result2.getText()
    results_columns.append(result2_NoHTML)

df = pd.DataFrame(results_headings, results_columns)   
df.to_csv('index.csv', index=False, encoding='utf-8')

Структура таблицы, которую я соскребаю с

<div class="box1">

<table class="table1">

<tr><td class="label">Item1</td><td>Value1</td></tr>

<tr><td class="label">Item2</td><td>Value2</td></tr>

<tr><td class="label">Item3</td><td>Value3</td></tr>

<tr><td class="label">Item4</td><td>Value4</td></tr>

</table>

</div>

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Итак, вы очистили свои данные и получили фрейм данных, как показано ниже. Обратите внимание, что столбцы остаются безымянными, но имена столбцов появляются в первой строке без какого-либо разделения от ваших данных:

df = pd.DataFrame([['Animal', 'Mineral', 'Vegetable'],
                   ['Bear', 'Quartz', 'Brocolli'],
                   ['Turtle', 'Amethyst', 'Asparagus']])

print(df)

        0         1          2
0  Animal   Mineral  Vegetable
1    Bear    Quartz   Brocolli
2  Turtle  Amethyst  Asparagus

Вы можете создать новый фрейм данных, начиная со второй строки, и назначить первую строку в виде столбцов:

df = pd.DataFrame(df.values[1:], columns=df.values[0])

print(df)

   Animal   Mineral  Vegetable
0    Bear    Quartz   Brocolli
1  Turtle  Amethyst  Asparagus
0 голосов
/ 04 июля 2018

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

Документация описывает это довольно хорошо: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_html.html

0 голосов
/ 04 июля 2018

Вы можете создать фрейм данных из указания, сгенерированного из results_headings и results_columns

import pandas as pd
results_headings = ['col 1', 'col 2']
results_columns = [('a','bb'), ('ccc','dddd')]
data_dict = {h: c for h, c in zip(results_headings, results_columns)}
df = pd.DataFrame(data_dict)   
df.to_csv('index.csv', index=False, encoding='utf-8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...