如何从pandas read_html重新索引格式错误的列?

时间:2016-11-05 05:50:09

标签: python python-3.x pandas dataframe multiprocessing

我正在从一个网站中检索一些内容,该网站包含多个具有相同列数的表,并带有pandas read_html。当我读取一个实际上有几个具有相同列数的表的链接时,pandas有效地将所有表读为一个(类似于平面/规范化表)。但是,我有兴趣对网站的链接列表(即几个链接的单个平面表)做同样的事情,所以我尝试了以下内容:

在:

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

尽管如此,我想我并没有明确指出read_html()列的核心,所以我得到了这个列表格式错误的列表:

输出:

[[                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 ]]

所以我的问题我应该移动哪个参数才能从上面的嵌套列表中获取平坦的pandas数据框?我尝试了header=0index_col=0match='"columns"',当我使用pd.Dataframe()创建pandas数据框时,它们都不起作用或我是否需要进行展平?我的主要目标是拥有一个像这个列一样的pandas数据框:

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

1 个答案:

答案 0 :(得分:3)

IIUC你可以这样做:

首先要返回连接的DF,而不是DF的列表(因为read_html返回DF的列表):

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

然后为所有网址连接它们:

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