【问题标题】:Pandas multiple dataframes into single将多个数据框转换为单个
【发布时间】:2018-01-03 10:13:29
【问题描述】:

对此进行了很多研究,但仍然找到了答案。

我有一个通过read_html 函数被拉入Pandas 的抓取表列表。这将返回数据框对象的列表。我可以连接到单个数据帧中,但问题在于每个表的预连接格式。

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

结构如下:

- 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

单表代码sn-p:

#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/naan。

以前的选择是将每个表读入一个 df 并附加到一个主控,但这相当慢且无法使用。

有什么建议吗?

【问题讨论】:

  • 或者df.set_index('0').iloc[:, ::2].T
  • 感谢@COLDSPEED 我认为由于read_html 返回设置索引的对象列表是一个问题。 Int64Index([0, 1], dtype='int64') 0 object 1 object dtype: object 我看看能不能把对象转换成能把索引设置为'ID'的东西
  • 你从哪里抓取这些数据?
  • @coldspeed 它是从文件共享中提取的,但它是一个意大利网站,打开了一系列链接,每个链接中的表格都是 html 并在不同的过程中上传。然后从原始 html 文件中解析列表
  • 根据您的输入,df.set_index(0).T 应该可以工作,如果不行,请解释原因。

标签: python pandas web-scraping concatenation


【解决方案1】:

函数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  

【讨论】:

  • 再次感谢!我在循环 read_html 时半接近,但并没有完全考虑在那里设置索引。现在完全有道理。谢谢
  • 你也一样,希望我能在这方面变得更胜任!
猜你喜欢
  • 2017-10-18
  • 2020-02-07
  • 1970-01-01
  • 2022-01-21
  • 2015-05-16
  • 2014-10-18
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
相关资源
最近更新 更多