问题描述
场景: 解析 PDF 银行对账单并转换为干净且格式化的 csv 文件。
我的尝试: 我设法使用 camelot 库解析 pdf 文件(表格格式),但未能在格式意义上产生所需的结果。
代码:
import camelot
import pandas as pd
tables = camelot.read_pdf('test.pdf',pages = '3')
for i,table in enumerate(tables):
print(f'table_id:{i}')
print(f'page:{table.page}')
print(f'coordinates:{table._bBox}')
tables = camelot.read_pdf('test.pdf',flavor='stream',pages = '3')
columns = df.iloc[0]
df.columns = columns
df = df.drop(0)
df.head()
for c in df.select_dtypes('object').columns:
df[c] = df[c].str.replace('$','')
df[c] = df[c].str.replace('-','')
def convert_to_float(num):
try:
return float(num.replace(',',''))
except:
return 0
for col in ['Deposits','Withdrawals','Balance']:
df[col] = df[col].map(convert_to_float)
我想出的逻辑是将这些行向上移动,如果日期列是 NaN,我猜是 n-1 我不知道这个逻辑是否正确。谁能帮我正确解决这个问题?
>我尝试了 Pandas groupby 和聚合函数,但它只合并整个数据并删除 NaN 和重复日期,这不合适,因为每个条目都是必需的。
解决方法
使用 Transform
-
df.loc[~df.Date.isna(),'group'] = 1
g = df.group.fillna(0).cumsum()
df['Description'] = df.groupby(g)['Description'].transform(' '.join)
new_df = df.loc[~df['Date'].isna()]