首页 > 解决方案 > Excel 到 Python 字典,用于使用 Openpyxl 进行过滤

问题描述

我正在尝试读取一个 excel 文件以将选定的列存储到 python 字典中。用于进一步的数据过滤和操作。我查阅了很多 Stackoverflow 现有问题以获取指示。但是,我能够弄清楚几件事。但是之前没有使用 Python 的经验给我带来了一些真正的挑战。我可以请你帮忙吗?以下是我能够使其在某种程度上发挥作用的代码。

from _collections import defaultdict
import openpyxl

SalesFunnel = defaultdict(list)

theFile = openpyxl.load_workbook('Report.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))

for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]


sfunnel = []


for row in range(1, currentSheet.max_row + 1):
    for column in "ADEF":  
        cell_name = "{}{}".format(column, row)
        SalesFunnel[row] = [cell_name, currentSheet[cell_name].value]
        SalesFunnel[row].append(SalesFunnel[row])
    print(SalesFunnel)

我的 excel 数据集包含重复的电子邮件和重复的潜在客户状态。每行包含一个创建日期。我需要找出潜在客户状态中每封电子邮件的日期的最大值和最小值。这样我就可以计算每个电子邮件地址之间的天数。但现在我无法以正确的格式读取数据。我还为唯一索引添加了一列,它只是唯一标识每一行的数字序列。

如果我以 json 格式得到类似的东西。那会很好。

{Index: 1, LeadStatus: Contacted, Email: joe@doe.com, CreatedDate: 7/9/2020}
{Index: 2, LeadStatus: Contacted, Email: joe@doe.com, CreatedDate: 8/10/2020}
{Index: 3, LeadStatus: Contacted, Email: joe@doe.com, CreatedDate: 9/11/2020}
{Index: 4, LeadStatus: Contacted, Email: ron@email.com, CreatedDate: 4/5/2020}
{Index: 5, LeadStatus: Contacted, Email: ron@email.com, CreatedDate: 7/6/2020}

还添加了我的 Excel 工作表的屏幕截图。您只能看到一封电子邮件,因为我有数千条记录。对于每封电子邮件,可能会有很多记录。潜在客户状态可能不是已联系。

在此处输入图像描述

标签: pythonexceldictionaryopenpyxl

解决方案


您可以使用 读取数据pandas。我假设您的数据从单元格开始,A1并且您正在阅读工作表中的所有内容。

data_df = pd.read_excel(sheet_path, sheet_name)

现在您可以计算每个组的日期maxmin日期并找到您的差异

data_df['MaxDate'] = data_df.groupby(['LeadStatus','Email'])['CreatedDate'].transform('max')
data_df['MinDate'] = data_df.groupby(['LeadStatus','Email'])['CreatedDate'].transform('min')
data_df['Difference'] = pd.to_datetime(data_df['MaxDate']) - pd.to_datetime(data_df['MinDate'])

如果您不想重复记录,请使用agg

agg_df = data_df.groupby(['LeadId','LeadStatus','Email']).agg(MaxDate=('CreatedDate','max'),
                     MinDate = ('CreatedDate', 'min')).reset_index()
agg_df['Difference'] = pd.to_datetime(agg_df['MaxDate']) - pd.to_datetime(agg_df['MinDate'])

您现在可以根据json需要转换为:

data_df.to_json(orient='records')

你也可以写到excel

with pd.ExcelWriter('..../new_doc.xlsx', engine='xlsxwriter') as writer:

    data_df.to_excel(writer, sheet_name='New Data', index=False)
    agg_df.to_excel(writer, sheet_name='Agg Data', index=False)

推荐阅读