Python、Pandas 连续阶梯

Python, Pandas concat ladder

我正在使用 tabula 包为我的工作文档编写一个 pdf 到 xlsx 的转换器。

我需要从 PDF 的所有页面中提取 tables 并将它们插入到 xlsx 文件中。

我将 read_pdf 用于“所有”页面并获得 1 页 table 列名:

所有其他页面都有 1、2、3、4 列名称:

所以我的问题是,当我尝试连接所有页面时,它们从第 2 页变成楼梯,如下所示:

那么我该如何解决这个问题,让每一页都一页一页地连接起来,而不是向右移动?

如果两个数据框具有相同的列名,则串联将按您预期的方式进行。所以第一个想法是将第二个数据框重命名为 df2.columns = df1.columns。然后连接应该工作。这里的问题是第二个数据框的列对我来说看起来像有效数据,这会丢失。

这里有一个保存此行的技巧。

df2.loc[-1] = df2.columns
df2 = df2.sort_index().reset_index(drop=True)
df2.columns = df1.columns
pd.concat([df1, df2], ignore_index=True)

这应该可以做到。

例子

这是一个小例子。我认为这符合您的问题。

df1 = pd.DataFrame({'a':[1,2,3,4], 'b':[1,2,3,4]})
>>> df1
   a  b
0  1  1
1  2  2
2  3  3
3  4  4
df2 = pd.DataFrame({'1':[1,2,3,4], '2':[1,2,3,4]})
>>> df1
   1  2 # << valid data here
0  1  1
1  2  2
2  3  3
3  4  4
df2.loc[-1] = df2.columns
df2 = df2.sort_index().reset_index(drop=True)
df2.columns = df1.columns
df = pd.concat([df1, df2], ignore_index=True)
>>> df
   a  b
0  1  1
1  2  2
2  3  3
3  4  4
4  1  2 # this data was saved
5  1  1
6  2  2
7  3  3
8  4  4

编辑

如果你有一个DataFrame列表,因为有多个页面,你可以循环遍历这个列表:

# df_list = [df1, ... dfn]
for i, item in enumerate(df_list[1:], start=1):
    df_temp = item
    df_temp.loc[-1] = df_temp.columns
    df_temp = df_temp.sort_index().reset_index(drop=True)
    df_temp.columns = df_list[0].columns
    df_list[i] = df_temp

final_df = pd.concat(df_list, ignore_index=True)