Python 将多个数据帧转换为单个数据帧

Python 将多个数据帧转换为单个数据帧,python,pandas,web-scraping,concatenation,Python,Pandas,Web Scraping,Concatenation,我们对此做了很多研究,但仍然找到了答案 我有一个通过read\u html函数拉入Pandas的刮表列表。这将返回dataframe对象的列表。我可以将concat转换为单个数据帧,但问题在于每个表pre-concat的格式 我需要转置,然后是concat,但不确定如何转置当第一步是数据帧的read\u html列表时,该功能无法在这种格式下工作。作为一个表,很容易设置一个新的索引并转换成精确的格式,而在批量运行时,这种方法是行不通的。列本质上是标题 结构如下: -0 1 0 Id 470 1

我们对此做了很多研究,但仍然找到了答案

我有一个通过
read\u html
函数拉入Pandas的刮表列表。这将返回dataframe对象的列表。我可以将concat转换为单个数据帧,但问题在于每个表pre-concat的格式

我需要转置,然后是concat,但不确定如何转置当第一步是数据帧的
read\u html
列表时,该功能无法在这种格式下工作。作为一个表,很容易设置一个新的索引并转换成精确的格式,而在批量运行时,这种方法是行不通的。列本质上是标题

结构如下:

-0 1
0 Id 470
1 Nome pozzo CLARA NORD 004 DIR A
2矿物气
3普罗杜齐奥内的斯塔托
4乌比卡锡安母马酒店
克拉拉北坎波5号
6双coltivazione B.C 13.AS特许权
克拉拉北滨海广场7号
拉科尔塔中央酒店
9埃尼歌剧院
2011年第10号绩效公告
11 Profondit\\xe0 1.872 m

所需输出部分示例:

Id Nome火山灰矿物Stato Ubicazione
56土地生产中的ALLI 004或OLIO

单表代码段:

#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
-标题值
0 Id 56
1 Nome pozzo ALLI 004或
2矿物油
3普罗杜齐奥内的斯塔托
4 Ubicazione TERRA
5坎波蒙特阿尔皮-蒙特埃诺
6农业许可证
7 raccolta e trattamento CENTRO OLIO VAL D\\\\'AGRI酒店
8埃尼运营商
9 2004年绩效公告
10深\\xe0 3.830米
11ID588
12 Nome pozzo GELA 109 DIR
13矿物油
14 Stato PRODUTTIVO非腐蚀性
15 Ubicazione TERRA
16 Campo GELA TERRA
17双氯噻嗪酮凝胶剂特许
18拉科尔塔中央酒店
19伊德罗卡布里地中海酒店
20 1997年绩效公告
21 Profondit\\xe0 3.493 m
22身份证705
23 Nome pozzo LUNA 010 DIR A
24矿物气
25 Stato PRODUTTIVO非腐蚀性
26乌比卡锡安母马
27月坎波酒店
28双氯噻嗪酮D.C 1.AG特许权
29月A日码头广场
...                                   ...                           ...

批量可以是这样的:

Id Nome火山灰矿物Stato Ubicazione
56土地生产中的ALLI 004或OLIO

Id Nome火山灰矿物Stato Ubicazione
54地面生产中的测试或OLIO
Id Nome火山灰矿物Stato Ubicazione
53 TERRA产品中的test1或OLIO

目的是从上述批量样式创建此样式

Id Nome火山灰矿物Stato Ubicazione
56土地生产中的ALLI 004或OLIO
54生产地的测试或OLIO 53 TERRA产品中的test1或OLIO

我假设发生这种情况是因为两列以行作为所需的标题开始,因此每次都会重复这些列,因为每个数据帧都有一列
“标题”

我相信concat会工作,如果在正确的转置格式之前。请注意,有些表格的列数不同,有些表格多达12列,有些表格只有9列。因此,对于我的12个标题,每个数据帧值都将填充,除非该表没有该列,否则该单元格将为null/naan

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

有什么建议吗?

函数返回数据帧列表,这样您就可以循环列表理解和转置。最后在
concat
add之后删除列名:

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  
或者可能
df.set\u in