使用多行标题清理原始数据

时间:2019-10-10 21:05:37

标签: python pandas

我需要整理从excel数据库导入的数据,问题是它具有包含客户信息的多行标题,然后是包含付款信息的许多行。我想从标题中获取数据,并使用合同号和操作情况(它们都在标题中)创建一个新列,并将此信息放置在每条支付行中,这样我就可以轻松地对数据帧进行切片。

我以前使用Excel,我所做的是在一列中创建带有IF语句的公式,该公式将标识标题中的合同编号,如果找不到,则会复制上面的单元格。 我的代码在列中标识了一个键字符串,然后从单元格之间的预定义距离获取了合同价值和状态。您可以在下面的python for循环中看到它。

python的for循环变得太慢了,这是我放弃excel的主要原因,所以我希望在python中有一种更快的方法。

我也尝试使用.where()函数,但是我无法为从标头中获取合同和状态信息的正确方法提供便利。

我使用的for循环是这样的:

report = pd.read_excel('report_filename.xls', header = None)

for j in range(report.shape[0]):
    if str(report.loc[j,1])[0:7] == 'Extract':
        contract = report.loc[j + 1, 3]
        status = report.loc[j + 7, 1]

    report.loc['contract #', j] = contrato
    report.loc['status'] = status

# Here is the final version of the code i used:

report = pd.read_excel('report_filename.xls', header = None)
report['Contract #'] = None
report['Status'] = None

for i, row in report.iterrows():
    if str(row[1]).lower().startswith('extract'):
        report.at[i, 'Contract #'] = report.at[i+1, 3]
        report.at[i, 'Status'] = report.at[i+7, 1]

report['Contract #'] = report['Contract #'].ffill(axis = 0)
report['Status'] = report['Status'].ffill(axis = 0)


report = report[report['Status'] != 'Inactive']

1 个答案:

答案 0 :(得分:0)

可以使用pandas.iterrows吗?

import pandas as pd

report = pd.read_excel('report_filename.xls', header = None)
newreport = report
newreport['Contract #'] = ''
newreport['Status'] = ''

for i, row in report.iterrows():
    if row[1].lower().startswith('extract'):
        newreport.at[i, 'Contract #'] = report.at[i+1, 3]
        newreport.at[i, 'Status'] = report.at[i+7, 1]