0

场景: 解析 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 和重复日期,这是不合适的,因为每个条目都是必需的。

4

1 回答 1

1

使用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()]
于 2021-05-01T16:37:17.437 回答