#pandas #concatenation #tabula
Вопрос:
Я пишу конвертер pdf в xlsx для своих рабочих документов с пакетом tabula.
Мне нужно извлечь таблицы со всех страниц PDF и вставить их в файл xlsx.
я использую read_pdf со «всеми» страницами и получаю таблицу 1 страницы с именами столбцов:
а все остальные страницы имеют имена столбцов 1,2,3,4:
Поэтому моя проблема в том, что, когда я пытаюсь объединить все страницы, они превращаются в лестницу со 2-й страницы, вот так:
Итак, как я могу это исправить, чтобы каждая страница соединялась одна за другой, не перемещаясь вправо?
Ответ №1:
Объединение будет работать так, как вы ожидаете, если оба кадра данных будут иметь одинаковые имена столбцов. Поэтому первая мысль-переименовать второй фрейм данных, как 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
Редактировать
Если у вас есть список кадров данных, из-за нескольких страниц вы можете просмотреть этот список:
# 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)
Комментарии:
1. будет ли это работать, если у меня будет не только 2 кадра данных, но их может быть более 50, потому что каждый кадр представляет собой страницу PDF…
2. когда я пытаюсь выполнить df2.loc[-1], я получаю ошибку ключа: -1, потому что каждый индекс представляет собой строку
3.
df2.loc[-1]
возникает ошибка, так как индекс-1
не существует. Ваш индекс начинается с0
.