Pandas DataFrame 按列值组合行,其中日期行为 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)

我的结果:

enter image description here

Desired_Output:

enter image description here

我想出的逻辑是将这些行向上移动,如果日期列是 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()]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...