Строки не добавляются правильно в Пандах - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я пытаюсь собрать данные из исследовательской базы данных - ScienceDirect. Я получаю название каждой исследовательской статьи, используя Beautiful Soup, и добавляю его в пустой фрейм данных панд. После этого я получаю информацию о типе исследовательской статьи для вышеуказанных статей. Однако, когда я пытаюсь добавить эти данные в фрейм данных, они добавляются в нижнюю часть, т.е. Вместо добавления к первым 100 строкам создается 100 новых строк.

from bs4 import BeautifulSoup as bs
soup = bs(requests.get(browser.current_url).text,"html.parser")

# Using soup to retrieve the elements related to Title, Type of Article, Names of Authors and Abstract
elements = soup.find_all("div", {"class","result-item-content"})

data = pd.DataFrame(columns = ["Abstract","Journal & Dates","Names of Authors","Title","Type of Article"])

for element in elements:
    atag = element.find('a')
    if atag:
        atag = atag.text.split("\n")
        data = data.append({"Title": atag}, ignore_index=True)

data.head()

Abstract    Journal & Dates Names of Authors    Title   Type of Article
0   NaN NaN NaN [Morphological, molecular identification and p...   NaN
1   NaN NaN NaN [Assessment of soil erosion in a tropical moun...   NaN
2   NaN NaN NaN [Ethnomedicinal assessment of Irula tribes of ...   NaN
3   NaN NaN NaN [Latitudinal variation in summer monsoon rainf...   NaN
4   NaN NaN NaN [IUCN greatly underestimates threat levels of ...   NaN

Теперь я пытаюсь найти информацию о типе исследовательской статьи и добавляю ее к указанному выше фрейму данных.

for element in elements:
    art_type = element.find("ol",{"class","OpenAccessArchive hor"})
    if art_type:
        art_type = art_type.text.split("\n")
        data = data.append({"Type of Article": art_type}, ignore_index=True)

data.tail()

    Abstract    Journal & Dates Names of Authors    Title   Type of Article
194 NaN NaN NaN NaN [Open access, Research article, ]
195 NaN NaN NaN NaN [Research article, ]
196 NaN NaN NaN NaN [Research article, ]
197 NaN NaN NaN NaN [Research article, ]
198 NaN NaN NaN NaN [Research article, ]

Если вы странно смотрите на конец информационного кадра, он добавляет информацию к последним 100 или 90 строкам. Как мне это исправить?

Кроме того, я новичок в выскабливании и питоне. Любые предложения о том, что было бы лучшим способом для хранения данных, чтобы я мог провести анализ того же позже? Например, вероятностное моделирование тем?

РЕДАКТИРОВАТЬ на основе ответа, я попробовал следующее, но я получаю ошибку:

data_dict = {}

# Create keys
for key in ["Abstract","Journal & Dates","Names of Authors","Title","Type of Article"]:
    data_dict[key] = []

# Loop through the elements object
for element in elements:

    # Find all the Title tags
    atag = element.find('a')
    if atag:
        atag = atag.text.split("\n")
        data_dict["Title"].append(atag)

    # Find all article_type information
    art_type = element.find("ol",{"class","OpenAccessArchive hor"})
    if art_type:
        art_type = art_type.text.split("\n")
        data_dict["Type of Article"].append(art_type)

    # Find Names of Authors
    author = element.find("ol",{"class","Authors hor undefined"})
    if author:
        author = author.text.split("\n")
        data_dict["Names of Authors"].append(author)

    # Find Journal Name
    journal = element.find("ol",{"class","SubType hor"})
    if journal:
        journal = journal.text.split("\n")
        data_dict["Journal & Dates"].append(journal)

data = pd.DataFrame(data_dict)

*ERROR*
~/miniconda/lib/python3.6/site-packages/pandas/core/frame.py in extract_index(data)
   6209             lengths = list(set(raw_lengths))
   6210             if len(lengths) > 1:
-> 6211                 raise ValueError('arrays must all be same length')
   6212 
   6213             if have_dicts:

ValueError: все массивы должны быть одинаковой длины

1 Ответ

0 голосов
/ 26 апреля 2018

Согласно комментариям, pd.DataFrame.append используется для добавления фрейма данных - по определению добавление новых строк - поэтому данные, которые вы пытаетесь вставить, вместо этого присоединяются в новых строках.Вы можете вставлять данные в фрейм отдельно, но это не красиво.Например, вы можете вставить с помощью data.loc[i,'Title'] = atag, где i - это счетчик строк (т. Е. i=3) note . Для этого также необходимо создать полноразмерный пустой кадр данных.

Вместо этого я рекомендую сначала заполнить словарь данными, а затем передать словарь в pandas;т.е.:

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs
import numpy as np


#fetch data
sample_url = "https://www.sciencedirect.com/search/advanced?qs=Climate%20Change&articleTypes=REV%2CFLA&show=100&sortBy=relevance"
soup = bs(requests.get(sample_url).text,"html.parser")
elements = soup.find_all("div", {"class","result-item-content"})

#create data container
data_dict = {}
for key in ["Title","Type of Article","Names of Authors","Journal & Dates"]:
    data_dict[key] = []
    #fields yet to add: "Abstract"

#convenience function:
def add_item(item,key,data_dict):
    #if item is found, add to data
    if item is not None:
        data_dict[key].append(item.text)
    #if nothing is found, add missing flag
    if item is None:
        data_dict[key].append(np.nan)

#loop over elements    
for element in elements:
    #find element
    art_type = element.find("ol",{"class","OpenAccessArchive hor"})
    add_item(art_type, "Type of Article", data_dict)

    #repeat for remainder of fields    
    atag = element.find('a')
    add_item(atag, 'Title', data_dict)

    author = element.find("ol",{"class","Authors hor undefined"})
    add_item(author, 'Names of Authors', data_dict)

    # Find Journal Name
    journal = element.find("ol",{"class","SubType hor"})
    add_item(journal,'Journal & Dates', data_dict)

data = pd.DataFrame(data_dict)

Пример вывода:

In [21]: data.head(n=3)
Out[21]:
                                     Journal & Dates  \
0  Global Environmental Change, Volume 50, May 20...
1  International Journal of Hygiene and Environme...
2  Global Environmental Change, Volume 50, May 20...

                                    Names of Authors  \
0  [K.M. Findlater, S.D. Donner, T. Satterfield, ...
1                                [Shouro Dasgupta, ]
2                    [Thad Kousser, Bruce Tranter, ]

                                               Title     Type of Article
0  Integration anxiety: The cognitive isolation o...  Research article,
1      Burden of climate change on malaria mortality  Research article,
2  The influence of political leaders on climate ...  Research article

Также обратите внимание, что отсутствуют значения.Я бы посмотрел на них ...

In [37]: data.isnull().sum()
Out[37]:
Journal & Dates      0
Names of Authors    15
Title                0
Type of Article      0
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...