2017-04-05 80 views
0

我有一张带有表格的pdf,并试图将该表格放入Pandas中。提取pdf表格非常困难,但我发现tabula的效果最好。这是我见过的最好的,但仍然不完美。我有这样的PDF表:如何重命名熊猫中的未命名列?

Table

注意的表头,以及他们如何有时运行到下一行,一般都不会好看。我面临着真正的问题,因为我看到的所有解决方案都要求首先创建一个更好的方法来创建数据框。这个数据框是我能得到的最好的数据,但是如果你知道如何从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 

如果你看,你可以看到头是前三行中的分类。我该如何解决?有没有什么聪明,优雅的解决方案可以为每一列选择三个名称中的“最好”,并将列名称?

谢谢!

+0

只需键入所有列名称,它可能比创建程序化解决方案还要快。 – Psidom

回答

1

这是一个纯粹的熊猫解决方案 - 假设数据框完全按照下面的方式读取。

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 
+0

我得到这个警告(Python 3.4,熊猫0.16.2)'FutureWarning:使用'+'提供设置联合索引已弃用'我尝试使用'联合',但我得到一个错误。任何帮助? – lukehawk

+0

升级到0.19或者尝试在所有人的末尾加上.values –

+0

Ahhhh yessss。当 - 我当时落后了。谢谢!!! – lukehawk