Я пытаюсь создать программу Python, чтобы привести в порядок таблицы, чтобы выполнить некоторые сравнения, используя pandas.
Входные данные будут выглядеть примерно так:
Date Customer CaseNumber Title Reference
24/03/2020 16:07 Customer 1 CAS-202963-F7R3J0 Test 68818312
24/03/2020 16:05 Customer 2 CAS-202962-R2L0F9 Test 68818307 & 78384618
24/03/2020 16:04 Customer 3 CAS-202961-M8F8N8 Test 68675847b
24/03/2020 14:58 Customer 4 CAS-202947-C3M3S0 Test
24/03/2020 13:27 Customer 5 CAS-202918-W1K1D7 Test 68400907
24/03/2020 13:16 Customer 6 CAS-202910-S2K4N3 Test 68816515 (second)
24/03/2020 12:39 Customer 7 CAS-202904-W5G2B0 Test
24/03/2020 11:19 Customer 8 CAS-202889-M2V9H2 Test 68815053
24/03/2020 08:49 Customer 9 CAS-202832-T7V0R4 Test 68813305
23/03/2020 16:14 Customer 10 CAS-202760-J6W8B9 Test Dave J
23/03/2020 14:32 Customer 11 CAS-202733-L2G4R0 Test
23/03/2020 14:20 Customer 12 CAS-202731-Z2M3D5 Test 68798854
23/03/2020 12:46 Customer 13 CAS-202685-K5D9X1 Test 68797272 38933456 78965412
21/03/2020 18:40 Customer 14 CAS-202438-Z1S7G8 Test 68760334
21/03/2020 06:46 Customer 15 CAS-202329-Y4L8Q0 Test 68755713 / 38079765
18/03/2020 11:29 Customer 16 CAS-201772-S9F8N0 Test 68707914
Я пытаюсь привести в порядок столбец Reference до:
- Удалить все строки без ссылочного номера
- Удалите любой текст, кроме номера
- Если больше 1 ссылки, выделите номер и добавьте дубликат строки с дополнительными номерами ссылок.
То, что я до сих пор придумал, это:
from tkinter import filedialog, Tk, messagebox
from os import *
from pandas import *
import re
root = Tk()
def openFile(text):
messagebox.showinfo("Open File", text)
root.filename = filedialog.askopenfilename(initialdir=getcwd(),
title="Select file",
filetypes=(("Excel Files", "*.xlsx"), ("all files", "*.*")))
return root.filename
def reindex(df):
df = df.reset_index(drop=True)
return df
calls = openFile("All open cases") # Open spreadsheet of active cases
df = read_excel(calls) # Read spreadsheet into Pandas dataframe
df.dropna(how="any", axis=0, inplace=True) # Drop any row with empty cells
df = reindex(df) # Reindex dataframe
df.columns = ["Date","Customer","CRMRef","CaseTitle","Reference"]
refRegex = re.compile(r"\d\d\d\d\d\d\d\d") # Regex to match 8 digit reference numbers
for ref in range(len(df["Reference"])):
results = refRegex.findall(df["Reference"][ref])
if len(results) == 0: # Drop any row where no matches to refRegex
df.drop(index=ref, inplace=True)
elif len(results) == 1: # If one single match, set that cell to be equal to the match to tidy up extra text
df.loc[ref,"Reference"] = results[0]
else: # If more than one reference
df.loc[ref, "Reference"] = results[0] # set the current reference equal to the first match
for i in range(len(results)-1): # Loop through all remaining matches
newline = df.loc[ref] # Create new line based on current line
newline.loc["Reference"] = results[i-1] # Amend Reference with next result
df = df.append(newline) # Append new line to end of dataframe
df = reindex(df)
name = "Output.xlsx"
writer = ExcelWriter(name, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Output')
writer.save()
Мои проблемы с этим двояки и возникают в конце для l oop.
- Кажется, что исправление новой строки работает, но получает параметр с копированием предупреждения
- Если ссылка содержит 2 числа, она работает как задумано. EG для клиентов 2 и 14 добавляется с их новым ссылочным номером к индексам 12 и 17. Но если есть 3 ссылки, как на клиенте 13, происходит сбой, ввод неправильных ссылочных номеров и создание новой строки, полной номеров ссылок, индекс 16 по результатам из данных примера.
{
Index Date Customer CRMRef CaseTitle Reference
12 2020-03-24 16:05:30 Customer 2 CAS-202962-R2L0F9 Test 78384618
13 2020-03-23 12:46:36 Customer 13 CAS-202685-K5D9X1 Test 78965412
14 2020-03-23 12:46:36 Customer 13 CAS-202685-K5D9X1 Test 68797272
15 2020-03-23 12:46:36 Customer 13 CAS-202685-K5D9X1 Test 78965412
16 68797272 68797272 68797272 68797272 68797272
17 2020-03-21 06:46:34 Customer 15 CAS-202329-Y4L8Q0 Test 38079765
}
Я знаю, что все делаю неправильно, но не могу понять как это лучше всего сделать.
Любая помощь будет принята с благодарностью!