2016-11-05 14 views
5

Pobieram niektóre treści ze strony internetowej zawierającej kilka tabel z taką samą liczbą kolumn, z pandem read_html. Kiedy czytam pojedyncze łącze, które ma kilka tabel z taką samą liczbą kolumn, pandy skutecznie odczytują wszystkie tabele jako jedną (coś w rodzaju płaskiej/znormalizowanej tabeli). Jednak jestem zainteresowany zrobić to samo dla listy linków ze strony internetowej (tj jednym płaskim stole przez kilka linków), więc próbowałem następujące:Jak ponownie wyświetlić zniekształcone zniekształcone kolumny pochodzące z pandy read_html?

w:

import multiprocessing 
def process(url): 
    df_url = pd.read_html(url) 
    df = pd.concat(df_url, ignore_index=False) 
    return df_url 

links = ['link1.com','link2.com','link3.com',...,'linkN.com'] 

pool = multiprocessing.Pool(processes=6) 
df = pool.map(process, links) 
df 

Niemniej jednak Chyba nie jestem specifiying corecctly do read_html() które są kolumny, więc jestem coraz to nieprawidłowy wykaz list:

OUT:

[[    Form  Disponibility \ 
    0 290090 01780-500-01) Unavailable - no product available for release. 

          Relation \ 

    Relation drawbacks 
    0     NaN      Removed 
    1     NaN      Removed ], 
[          Form \ 

            Relation \ 
    0 American Regent is currently releasing the 0.4... 
    1 American Regent is currently releasing the 1mg... 

    drawbacks 
    0 Demand increase for the drug 
    1       Removed , 
              Form \ 
    0 0.1 mg/mL; 10 mL Luer-Jet Prefilled Syringe (N... 

    Disponibility Relation \ 
    0       Product available     NaN 
    2      Removed 
    3      Removed ]] 

więc moje pytanie który parametr należy przenieść, aby uzyskać płaską ramkę danych pandy z powyższej zagnieżdżonej listy ?. Próbowałem wykonać: header=0, index_col=0, match='"columns"', żaden z nich nie działał lub nie muszę wykonywać flattingu, gdy tworzę ramkę danych pandy z pd.Dataframe()? Moim głównym celem jest, aby mieć dataframe pandy jak z tej kolumny:

form, Disponibility, Relation, drawbacks 
1 
2 
... 
n 

Odpowiedz

3

IIUC można to zrobić w ten sposób:

najpierw chcesz wrócić łączone DF, zamiast listy DFS (jak read_html powroty lista z DFS):

def process(url): 
    return pd.concat(pd.read_html(url), ignore_index=False) 

a następnie złączyć je dla wszystkich adresów URL:

df = pd.concat(pool.map(process, links), ignore_index=True) 
+0

Dzięki za pomoc. W '----> 4 df = pd.concat (pool.map (process, links), ignore_index = True)'. Mam: 'TypeError: nie można połączyć obiektu innego niż NDFrame'. Każdy pomysł, dlaczego tak się dzieje i co robić ?. – tumbleweed

+1

@tumbleweed, co zwróci 'pool.map (process, links)'? Czy to lista DF czy coś innego? – MaxU

+0

Jeszcze raz dziękuję Max, trzymaj się, ponownie go uruchomię i trwa to trochę dłużej. – tumbleweed

Powiązane problemy