使用Python和Pandas处理Excel电子表格

yc0p9oo0  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(117)

我是Python的新手(从零到基本),但我喜欢编码的简单性。在以下问题中寻求帮助。提前表示感谢
我有两个电子表格
1.一个包含一列文件夹路径列表(分隔符-反斜杠)-检查电子表格
1.其他包含3列产品代码,wordslist,优先级-主电子表格
我试图写一个Python代码扫描所有检查电子表格一次在一个文件夹中对一个主电子表格。这是我写的扫描一个检查电子表格的要求排序。
1.从检查电子表格中读取每个单元格,可选择从右向左读取(RL)
1.从主电子表格中搜索每个单词到“wordslist”列(单元格中的逗号分隔值)
1.如果找到,保存代码和优先级,并继续搜索单词,直到Master结束
1.从搜索结果中,查找具有最高优先级的代码(与2相比,1具有最高优先级)
1.在“检查”电子表格中的单元格的相邻列中添加最高优先级代码
1.如果未找到,请继续搜索(根据所选选项从R到L,从L到R)“检查”电子表格中文件夹路径中的所有单词
1.如果文件夹路径中的任何单词在Master中找不到,则将“TBD”添加到“Check”电子表格中单元格的相邻列中
1.移动到下一个单元格并重复步骤1到7
主电子表格包含3列数据,如:
| 产品代码|文字列表|优先级|
| - -----|- -----|- -----|
| prdX001|文件夹1名称,苹果,橙色,子文件夹2名称|一个|
| prdX002|文件夹1名称,苹果,文件夹2名称,橙色|2|
| prdX003| subfolder 1 name,apple,orange,folder 2 name|三个|
| prdX004| apple,orange,文件夹1名称,子文件夹2名称|4|
检查电子表格是否包含以下数据:从右向左阅读
| 测试值|应用的代码|原因(了解未添加到检查电子表格中的原因)|
| - -----|- -----|- -----|
| \server\fileshare\folder 1 name\subfolder 1 name|三个|(prdx004不适用,优先级低)|
| \server\fileshare\folder 2 name\subfolder 2 name|一个||
我有2个不同的方案,希望结合不知道如何。缺乏经验有时令人沮丧。
1.从“检查”电子表格中选择一个单元格

# Loop will print all values of first column
for i in range(2, m_row + 1):
    cell_obj = sheet_obj.cell(row = i, column = 1)
    # print(cell_obj.value)
    path = os.path.normpath(cell_obj.value)
    split_path = path.split('\\')
    for x in range(len(split_path)):
        #Don't like this hard coding
        if x > 3:
            if len(split_path[x]) > 0:
                print(split_path[x])

1.在主电子表格中搜索

# Read Excel file
df = pd.read_excel(path_universal,sheet_name=1, usecols=[1])
for value in df['wordslist']:
    # do something with value
    my_list = df['wordslist'].str.split(',')
    print(tuple(my_list))
cvxl0en2

cvxl0en21#

我认为以下内容会产生您正在寻找的内容。我已经添加到您的初始代码,所以它的一些是相同的。
一些变化:
1.使用整个df(从Master文件),并且使用整个 Dataframe 比循环遍历每行并使用列表更容易。
1.我已经改变了目录分割的“硬编码”条件。
从左到右或从右到左以及创建主文件dataframe:

import os
import pandas as pd
import openpyxl

LR = True  # if True then left-to-right, if False then right-to-left

# Searching in Master spreadsheet
# Read Excel file
path_universal = "Master.xlsx"
df = pd.read_excel(path_universal,sheet_name="Sheet1")
# split "wordslist" column and explode to separate rows
df["wordslist"] = df["wordslist"].str.split(",")
df = df.explode("wordslist")
# remove trailing and leading whitespaces
df["wordslist"] = df["wordslist"].str.strip()

Check文件:

wb = openpyxl.load_workbook("Check.xlsx")
sheet_obj = wb["Sheet1"]
m_row = sheet_obj.max_row

# Pick up one cell from 'Check' spreadsheet
# Loop will print all values of first column
for i in range(2, m_row + 1):
    cell_obj = sheet_obj.cell(row=i, column=1)
    # print(cell_obj.value)
    path = os.path.normpath(cell_obj.value)
    # split, filter for not "", and reverse if LR==False
    split_path = list(filter(None, path.split("\\")))[::(1 if LR else -1)]
    code, priority = None, None
    for s in split_path:
        # filter df for matching with s
        df1 = df[df["wordslist"].eq(s)]
        # if no matches then df1 is empty, otherwise df1.empty is False
        if not df1.empty:
            (code, _, priority) = df1[df1["priority"].eq(df1["priority"].min())].iloc[0].values
            break  # stop after 1st match
    if not code:
        code, priority = "TBD", "TBD"  # "TBD" if no matches
    sheet_obj.cell(row=i, column=4).value = code
    sheet_obj.cell(row=i, column=5).value = priority
# add headers to new columns
sheet_obj.cell(row=1, column=4).value = "Master Code"
sheet_obj.cell(row=1, column=5).value = "Priority"

# save and close Check spreadsheet
wb.save("Check.xlsx")
wb.close()

注意:您可能需要更改文件名!

相关问题