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