Очистка необработанных данных с помощью многострочного заголовка - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно организовать данные, которые я импортирую из базы данных 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 голосов
/ 11 октября 2019

Можете ли вы использовать 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...