#python #pandas #dataframe #pdf #tabula-py
#python #pandas #фрейм данных #PDF #tabula-py
Вопрос:
Я использую tabula
для того, чтобы concat
все tables
в следующем файле PDF
Чтобы быть одной таблицей в excel
формате.
Вот мой код:
from tabula import read_pdf
import pandas as pd
allin = []
for page in range(1, 115):
table = read_pdf("goal.pdf", pages=page,
pandas_options={'header': None})[0]
allin.append(table)
new = pd.concat(allin)
new.to_excel("out.xlsx", index=False)
Также я попробовал следующее:
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf", pages='all', pandas_options={'header': None})
new = pd.concat(table, ignore_index=True)
new.to_excel("out.xlsx", index=False)
Текущий результат: проверка
Но проблема, с которой я сталкиваюсь, заключается в том, что со страницы # 91
я начинаю видеть данные, неправильно отформатированные в excel
файле.
Я отлаживал страницу по отдельности и не мог понять, почему она неправильно отформатирована, особенно в том же формате.
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf", pages='91', pandas_options={'header': None})[0]
print(table)
Пример:
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf", pages='90-91', pandas_options={'header': None})
new = pd.concat(table, ignore_index=True)
new.to_excel("out.xlsx", index=False)
Здесь я запустил код для двух страниц 90 и 91.
начиная со строки # 48, вы увидите разницу здесь
Где вы заметите проблему, связанную с тем, что имя и адрес помещены в одну ячейку. А также город и штат, помещенные в один вызов
Комментарии:
1. что означает «данные не отформатированы правильно»? Покажите, что вы получаете и чего ожидаете.
2. Вы проверили вывод, который я упомянул в моем посте, если вы только что запустили код на странице # 90, затем 91, чтобы вы его получили
3. Я проверил страницу по ссылке
check
, но я не вижу ничего особенного, и я не знаю, что искать, потому что я не знаю, что означает"data not formatted correctly"
. И я слишком ленив, чтобы запускать код, чтобы увидеть результат.4. @furas хорошо, теперь я отредактировал свой вопрос. надеюсь, теперь это лучше получить. поскольку я пытался избежать длинного вопроса 🙂
5. вы имеете в виду, что в некоторых строках у вас есть
["DENTON", "TX"]
а в других["DENTON TX", ""]
? Вы могли бы описать это в вопросе, потому что это не так просто увидеть. Вы можете объединить оба столбца и снова разделить на последний пробел.
Ответ №1:
Я покопался в исходном коде, и в нем есть опция столбцы, и вы можете вручную определить границы столбцов. Когда вы устанавливаете, columns
тогда вы должны использовать guess=False
.
tabula-py
использует программу tabula-java, и в ее документации я обнаружил, что ей нужны значения в процентах или точках (не в пикселях). Итак, я использовал программу inkscape для измерения границ в точках.
from tabula import read_pdf
import pandas as pd
# display all columns in dataframe
pd.set_option('display.width', None)
columns = [210, 350, 420, 450] # boundaries in points
#columns = ['210,350,420,450'] # boundaries in points
pages = '90-92'
#pages = [90,91,92]
#pages = list(range(90,93))
#pages = 'all' # read all pages
tables = read_pdf("goal.pdf",
pages=pages,
pandas_options={'header': None},
columns=columns,
guess=False)
df = pd.concat(tables).reset_index(drop=True)
#df.rename(columns=df.iloc[0], inplace=True) # convert first row to headers
#df.drop(df.index[0], inplace=True) # remove first row with headers
# display
#for x in range(0, len(df), 20):
# print(df.iloc[x:x 20])
# print('----------')
print(df.iloc[45:50])
#df.to_csv('output-pdf.csv')
#print(df[ df['State'].str.contains(' ') ])
#print(df[ df.iloc[:,3].str.contains(' ') ])
Результат:
0 1 2 3 4
45 JARRARD, GARY 930 FORT WORTH DRIVE DENTON TX (940) 565-6548
46 JARRARD, GARY 2219 COLORADO BLVD DENTON TX (940) 380-1661
47 MASON HARRISON, RATLIFF ENTERPRISES 1815 W. UNIVERSITY DRIVE DENTON TX (940) 387-5431
48 MASON HARRISON, RATLIFF ENTERPRISES 109 N. LOOP #288 DENTON TX (940) 484-2904
49 MASON HARRISON, RATLIFF ENTERPRISES 930 FORT WORTH DRIVE DENTON TX (940) 565-6548
Редактировать:
Может потребоваться также опция area
(также в пунктах) для пропуска заголовков. Или вам придется удалить первую строку на первой странице.
Я не проверял все строки, но могут потребоваться некоторые изменения в границах столбцов.
Редактировать:
Несколько строк создают проблему — вероятно, потому, что текст в City
слишком длинный.
col3 = df.iloc[:,3]
print(df[ col3.str.contains(' ') ])
Результат:
0 1 2 3 4
1941 UMSTATTD RESTAURANTS, LLC 120 WEST US HIGHWAY 54 EL DORADO SPRING MS O (417) 876-5755
2079 SIMONS, GARY 1412 BURLINGTON NORTH KANSAS CIT MY O (816) 421-5941
2763 GRISHAM, ROBERT (RB) 403 WEST COURT STREET WASHINGTON COU ORTH HOU S(E740) 335-7830
2764 STAUFFER, JACOB 403 WEST COURT STREET WASHINGTON COU ORTH HOU S(E740) 335-7830