Использование Pandas для очистки таблицы Excel - удаление / копирование строк и изменение ячеек - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь создать программу 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. Удалить все строки без ссылочного номера
  2. Удалите любой текст, кроме номера
  3. Если больше 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

}

Я знаю, что все делаю неправильно, но не могу понять как это лучше всего сделать.

Любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...