2

我有一个带有表格的 pdf,并试图将该表格放入 Pandas。众所周知,提取 pdf 表格很难正确,但我发现 tabula 效果最好。这是我见过的最好的,尽管仍然不完美。我有这个 pdf 表:

桌子

请注意表格的标题,以及它们有时如何运行到下一行,并且通常不是很好。我正在面对真正的问题,因为我看到的所有解决方案都首先需要一种更好的方法来创建数据框。这个数据框是我能得到的最好的,但如果你知道如何从表格中获得更好的数据框,请告诉我。

我使用 tabula-py,并运行以下代码:

holdingsDF = tbla.read_pdf(fileName, nospreadsheet=True)

有很多选项,我不知道所有选项,但这似乎是我能做的最好的,在摆弄选项之后。得到的 DF 是这样的:

         Unnamed: 0                  Unnamed: 1      Unnamed: 2 Identifier Unnamed: 4 Curren Unnamed: 6 TAG0 Strategy  
0        Asset Type                        Name      Identifier        NaN   Quantity    NaN      Price           NaN  
1               NaN                         NaN             NaN       Type        NaN     cy        NaN          Name  
2            Equity     Akamai Technologies Inc  AKAM US Equity     TICKER    (5,830)    USD     65.000          AKAM   
3  Convertible Bond             AKAM 0 02/15/19    US00971TAG67       ISIN  1,595,000    USD    100.875          AKAM   
4            Equity  Advanced Micro Devices Inc   AMD US Equity     TICKER  (181,500)    USD     13.490           AMD  
5  Convertible Bond          AMD 2 1/8 09/01/26    US007903BD80       ISIN  1,650,000    USD    185.500           AMD 

如果你看,你会看到标题在前三行中被分割了。我该如何解决?是否有任何聪明、优雅的解决方案来为每列取三个名称中的“最佳”,并将其设为列名称?

谢谢!!

4

1 回答 1

3

这是一个纯粹的 pandas 解决方案 - 假设数据帧完全按照下面粘贴的方式读取。

df.columns = df.columns.str.replace('Unnamed.*', '') + \
             df.iloc[0].fillna('') + \
             df.iloc[1].fillna('')

df.drop([0,1], inplace=True)


1        Asset Type                        Name      Identifier  \
2            Equity     Akamai Technologies Inc  AKAM US Equity   
3  Convertible Bond             AKAM 0 02/15/19    US00971TAG67   
4            Equity  Advanced Micro Devices Inc   AMD US Equity   
5  Convertible Bond          AMD 2 1/8 09/01/26    US007903BD80   

1 IdentifierType   Quantity Currency    Price TAG0 StrategyName  
2         TICKER    (5,830)      USD   65.000              AKAM  
3           ISIN  1,595,000      USD  100.875              AKAM  
4         TICKER  (181,500)      USD   13.490               AMD  
5           ISIN  1,650,000      USD  185.500              None  
于 2017-04-05T16:45:11.590 回答