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)
我正在使用 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)