已经做了很多调查,但仍然找到答案。
我有一个通过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并追加到主服务器,但这很慢且无法使用。
有什么建议吗?
答案 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