【发布时间】: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 TERRAId 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