Питон, Панды объединяют лестницу

#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 .