我需要整理从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']
答案 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]