繁体   English   中英

Pandas DataFrame 按列值组合行,其中日期行是 NULL

[英]Pandas DataFrame combine rows by column value, where Date Rows are NULL

场景:解析 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()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM