将多个数据帧放入单个

时间:2018-01-03 10:13:30

标签: python pandas web-scraping concatenation

已经做了很多调查,但仍然找到答案。

我有一个通过read_html函数被拉入Pandas的已删除表的列表。这将返回数据框对象的列表。我可以连接到一个数据帧,但问题是每个表pre concat的格式。

我需要Transpose然后concat但不确定当第一步是read_html数据帧列表时如何Transpose,该功能无法以这种格式工作。作为一个单独的表,很容易设置一个新的索引并转换为确切的格式,就像在批量运行时那种方法不起作用。列本质上是标题。

结构如下:

- 0 1 0 Id 470 1 Nome pozzo CLARA NORD 004 DIR A 2 Minerale GAS 3 Stato IN PRODUZIONE 4 Ubicazione MARE 5 Campo CLARA NORD 6 Concessione di coltivazione B.C 13.AS 7 Piattaforma marina CLARA NORD 8 Centrale di raccolta e trattamento FALCONARA 9 Operatore ENI 10 Anno di perforazione 2011 11 Profondit\\xe0 1.872 m

所需的输出部分示例:

Id Nome pozzo Minerale Stato Ubicazione 56 ALLI 004 OR OLIO IN PRODUZIONE TERRA

单个表格代码段:

#Table declared
 table = soup.find_all('table')
 table1 = str(table)
 df = pd.pandas.read_html(table1)[0] #limited for example
 df2 = pd.concat(df, ignore_index=True) #concat full list of df's
 df.columns = ['header', 'value'] #column header set for transpose
 df = df.set_index('header').T #index set and transposed

希望您了解水平输出。问题是,当我将标签的多个列/行转置为批量时,标题出现在每个数据帧上。有几百个数据帧可以转置并生成一个数据帧

批量代码:

#Table declared
 table = soup.find_all('table')
 table1 = str(table)
 df = pd.pandas.read_html(table1)
 df2 = pd.concat(df, ignore_index=True) #concat full list of df's
 df2.columns = ['header', 'value'] #column header set for transpose

- header value 0 Id 56 1 Nome pozzo ALLI 004 OR 2 Minerale OLIO 3 Stato IN PRODUZIONE 4 Ubicazione TERRA 5 Campo MONTE ALPI-MONTE ENOC 6 Concessione di coltivazione VAL D\\\'AGRI 7 Centrale di raccolta e trattamento CENTRO OLIO VAL D\\\'AGRI 8 Operatore ENI 9 Anno di perforazione 2004 10 Profondit\\xe0 3.830 m 11 Id 588 12 Nome pozzo GELA 109 DIR 13 Minerale OLIO 14 Stato PRODUTTIVO NON EROGANTE 15 Ubicazione TERRA 16 Campo GELA TERRA 17 Concessione di coltivazione GELA 18 Centrale di raccolta e trattamento NUOVO CENTRO OLIO GELA 19 Operatore ENI MEDITERRANEA IDROCARBURI 20 Anno di perforazione 1997 21 Profondit\\xe0 3.493 m 22 Id 705 23 Nome pozzo LUNA 010 DIR A 24 Minerale GAS 25 Stato PRODUTTIVO NON EROGANTE 26 Ubicazione MARE 27 Campo LUNA 28 Concessione di coltivazione D.C 1.AG 29 Piattaforma marina LUNA A ... ... ...

批量可能是这样的:

Id Nome pozzo Minerale Stato Ubicazione 56 ALLI 004 OR OLIO IN PRODUZIONE TERRA
Id Nome pozzo Minerale Stato Ubicazione 54 test OR OLIO IN PRODUZIONE TERRA Id Nome pozzo Minerale Stato Ubicazione 53 test1 OR OLIO IN PRODUZIONE TERRA

目标是从上面的批量样式创建它。

Id Nome pozzo Minerale Stato Ubicazione 56 ALLI 004 OR OLIO IN PRODUZIONE TERRA
54 test OR OLIO IN PRODUZIONE TERRA 53 test1 OR OLIO IN PRODUZIONE TERRA

我认为发生这种情况是因为两列开始时行是所需的标题,因此每次重复这些列时,每个数据帧都有一列'header'

我相信如果以前使用正确的转置格式,concat会起作用。请注意,有些表的列有所不同,有些表有12个,有些则有9个。因此,对于我的12个标题,每个数据帧值都会填充,除非该表没有该列,因此将null / na该单元格。

之前的选项是将每个表读入df并追加到主服务器,但这很慢且无法使用。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

函数read_html返回DataFrames的列表,因此您可以循环列表理解,set_index和转置。在concat添加rename_axis以删除列名称之后的最后一次:

dfs = [df.set_index(0).T for df in pd.pandas.read_html(table1)]
df = pd.concat(dfs, ignore_index=True).rename_axis(None, 1)

print (df)
    Id    Nome pozzo Minerale                    Stato Ubicazione  \
0   56   ALLI 004 OR     OLIO            IN PRODUZIONE      TERRA   
1  588  GELA 109 DIR     OLIO  PRODUTTIVO NON EROGANTE      TERRA   

                   Campo Concessione di coltivazione  \
0  MONTE ALPI-MONTE ENOC               VAL D\\\'AGRI   
1             GELA TERRA                        GELA   

  Centrale di raccolta e trattamento                     Operatore  \
0          CENTRO OLIO VAL D\\\'AGRI                           ENI   
1             NUOVO CENTRO OLIO GELA  ENI MEDITERRANEA IDROCARBURI   

  Anno di perforazione Profondit\\xe0  
0                 2004        3.830 m  
1                 1997        3.493 m