熊猫 - 无法匹配包含**

时间:2017-11-30 20:57:43

标签: python-2.7 pandas

我知道这可能是一个不好的做法,但我工作的公司将存储组织名称,其中包含**标题中的特殊信息,这让我感到非常头痛。仍在学习python的绳索,并希望得到一些澄清和一些帮助:

首先,介绍我要做的事情。

我有一个记录数据库,我需要将其分配给拥有组织的团队的独立成员。遗憾的是,我们的系统正在重新设计,这份报告被认为是“遗产”,因此我不得不在我们的系统之外执行此操作。

数据传入如下:

Case Reason Referral Partners
Case reason 1   Org 1
Case reason 1   Org 2363
Case reason 8   Org 53
Case reason 4   Org 100
Case reason 3   org 68
Case reason 2   Org 100

我将工作人员与他们分配的组织保存在一个字典中,并将工作人员的字典保存在我们的CRM中,例如

org_owners = {'Worker 1': ['Org 1', 'Org 2']}
user_id = {'Worker 1' : 'ID 1'}

我运行它的代码看起来像这样:

for i in user_id:
    list_of_values = hospital_owners[i]
    for index, row in df.iterrows():

        if row['Referral Partners'] in (list_of_values):
            print(user_id[i])
            row['User Id'] = user_id[i]
        else:
            pass
writer = pd.ExcelWriter('testoutput.xlsx')
df.to_excel(writer)
writer.save()

产生我想要的结果:

Case Reason      Referral Partners    Owner ID
Case Reason 1    Org 1                ID1
Case Reason 1    Org 2363             ID13

超级简单的代码,我确信它不是最快的,我总是愿意接受和学习的任何建议。我的问题是,它正确地指定每个单独的组织期望看起来像:

org1**Partner Handles X Type of Case

任何与**不匹配的东西。我该如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来pandas可以替换大部分代码。

import pandas as pd

首先,我们将构建一个近似于您的CRM的数据框。

df = pd.DataFrame({'Case Reason':['Case reason 1','Case reason 1','Case reason 8','Case reason 4'],
               'Referral Partners':['Org 1','Org 2363','Org 1**Partners','Org 100']})

    Case Reason     Referral Partners
0   Case reason 1   Org 1
1   Case reason 1   Org 2363
2   Case reason 8   Org 1**Partners
3   Case reason 4   Org 100

如果CRM中的数据位于平面文件中,您可以使用pandas.read_csv()将其加载到数据框中。完成后,您可以利用pandas的速度对之前使用for循环完成的结果数据帧执行操作。

接下来,我看到你有两本词典;一个将Orgs链接到Workers,另一个链接Worker和Worker ID。如果可能,通过构建一个将Orgs作为键,将Worker ID作为项的字典来简化此操作可能会有所帮助,如下所示。

org_owners = {'Org 1':'ID 1','Org 2':'ID 1'}

这使得使用pandas map函数将此字典中的键重新编码为相应的项目变得更容易一些。但是,如果您仍然需要工作人员编号(例如,“工作人员1”),您可以使用以下过程从组织编号重新编码为工作人员编号,然后从工作人员编号重新编码为工作人员编号,而不是上面重新配置的字典。肯定有更好的方法来完成这件作品,但这就是我想到的一切。

下面的行会创建一个包含所有者ID的新列。使用pandas extract string method,我们可以使用正则表达式查找引荐合作伙伴列中以“Org”开头,后跟单个空格(\ W)和至少一个数字(\ d {1,})的任何字符串。这将允许我们忽略出现在单元格中的双星号和其他文本。接下来,map function执行重新编码操作,生成与Worker名称对应的Worker ID。

df['Owner ID'] = df['Referral Partners'].str.extract('(Org\W\d{1,})',expand=False).map(org_owners)

这将导致下面的数据帧。

    Case Reason     Referral Partners   Owner ID
0   Case reason 1   Org 1               ID 1
1   Case reason 1   Org 2363            NaN
2   Case reason 8   Org 1**Partners     ID 1
3   Case reason 4   Org 100             NaN

现在,您只需提供to_excel的路径即可将数据框保存为Excel文件。

df.to_excel('/path/to/excel_file.xlsx')