如何重命名 Pandas 中未命名的列?
How to rename unnamed columns in Pandas?
我有一个包含 table 的 pdf,我正在尝试将 table 转换为 Pandas。众所周知,提取 pdf tables 很难,但我发现 tabula 效果最好。这是我所见过的最好的,尽管仍然不完美。我有这个 pdf table:
请注意 table 的 header,以及它们有时如何 运行 到下一行,并且通常不太好。我是在介绍真正的问题,因为我能看到的所有解决方案都需要一种更好的方法来首先创建数据框。这个数据框是我能得到的最好的,但如果你知道如何从 tabula 中得到更好的数据框,请告诉我。
我使用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
如果您仔细观察,您会发现 header 已经被分成了前三行。我该如何解决?是否有任何聪明、优雅的解决方案来为每列取三个名称的 'best',并将其作为列名称?
谢谢!!
这是一个纯粹的 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
我有一个包含 table 的 pdf,我正在尝试将 table 转换为 Pandas。众所周知,提取 pdf tables 很难,但我发现 tabula 效果最好。这是我所见过的最好的,尽管仍然不完美。我有这个 pdf table:
请注意 table 的 header,以及它们有时如何 运行 到下一行,并且通常不太好。我是在介绍真正的问题,因为我能看到的所有解决方案都需要一种更好的方法来首先创建数据框。这个数据框是我能得到的最好的,但如果你知道如何从 tabula 中得到更好的数据框,请告诉我。
我使用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
如果您仔细观察,您会发现 header 已经被分成了前三行。我该如何解决?是否有任何聪明、优雅的解决方案来为每列取三个名称的 'best',并将其作为列名称?
谢谢!!
这是一个纯粹的 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