【问题标题】:How to use Nested dict to replace string in other column如何使用嵌套字典替换其他列中的字符串
【发布时间】:2021-03-20 22:17:15
【问题描述】:

我有一个像下面这样的嵌套字典,如果该键位于字符串的末尾,我想使用内部键值对替换字符串,仅当国家代码等于 dict 键(不是内部键)时才用值替换它

'IND': {' PVT. LTD.': ' Pvt. Ltd.',
 ' pvt. Ltd': ' Pvt. Ltd.',
 ' PVT LTD': ' Pvt. Ltd.',
 ' L.L.P.': ' LLP',
 ' LTD.': ' Ltd.',
 ' LLP.': ' LLP',
 ' ltd': ' Ltd.',
 ' llp': ' LLP'},
 'GBR': {' P.L.C.': ' PLC',
 ' C.I.C.': ' CIC',
 ' p.l.c': ' PLC',
 ' c.i.c': ' CIC',
 ' s.e.': ' SE',
 ' PLC.': ' PLC'},
 'USA': {' LTD. CO.': ' Ltd. Co.',
 ' L.L.L.P.': ' LLLP',
 ' ltd. Co': ' Ltd. Co.',
 ' l.l.l.p': ' LLLP',
 ' L.L.P.': ' LLP',
 ' L.L.C.': ' LLC',
 ' l.l.p': ' LLP',
 ' l.l.c': ' LLC'}

我的数据框有两个列。法定名称和注册国家代码 -

Name Reg Country Code
NexPoint LTD. CO. USA
Silverplay P.L.C. GBR
ALLOYS PVT. LTD. IND
GALLIUM ltd. IND
ELLIOTT s.e. GBR

我使用了下面的代码 - 当合法名称找到内部键但不使用外部键检查国家/地区条件时,它正在替换字符串。有人可以建议我吗? (我有一个很大的清单)

for i in range(len(df)):
    for k1 in country_dict.items():
        if df.loc[i, 'Reg Country Code'] == k1:
            for k2, v2 in country_dict[k1].items():
                df.loc[df['Reg Country Code'] == k1, 'Name'] = [re.sub(k2, v, x) if x.endswith(k2) else x for x in df.loc[df['Reg Country Code'] == k1, 'Name']]

我的输出应该是:

Name Reg Country Code
NexPoint Ltd. Co. USA
Silverplay PLC GBR
ALLOYS Pvt. Ltd. IND
GALLIUM Ltd. IND
ELLIOTT SE GBR

【问题讨论】:

  • 什么是dfcountry_dict 是什么?您能否提供一个完整的最小示例的可执行示例数据?

标签: python regex pandas dictionary nested


【解决方案1】:

您可以按国家代码对df进行分组并替换

df['NAME'] = df.groupby('REG COUNTRY CODE')['NAME'].apply(lambda x: x.replace(d[x.name], regex = True))

    NAME                REG COUNTRY CODE
0   NexPoint Ltd. Co.   USA
1   Silverplay PLC      GBR
2   ALLOYS Pvt. Ltd.    IND
3   GALLIUM Ltd..       IND
4   ELLIOTT SE          GBR

解释:

  • df.groupby('REG COUNTRY CODE').name 返回组的名称(在这种情况下为国家代码)。

  • 通过使用 d[x.name],我们可以访问对应字典键(国家代码)的值字典

  • 将正则表达式设置为 True 有助于我们部分替换字符串

【讨论】:

  • 很好的答案!
  • @Vaishali 感谢您的快速回复。这对我不起作用。这里的 d[x.name] 是什么。我们不是使用字典来决定使用哪个密钥对进行替换吗?我的意思是第一层字典键来决定国家和第二层键来检查名称中是否存在,然后如果找到则用值替换?对不起,如果我听起来很天真。 stackoverflow.com/users/6287308/vaishali
  • @user14613954,添加了一些解释。不工作意味着什么问题?
  • 我可以跳到这里,所以 d 在这种情况下是你的字典:d = {'IND': {' PVT. LTD.': ' Pvt. Ltd.', ' pvt. Ltd': ' Pvt. Ltd.',...。您必须为您的字典分配变量名称 d 才能使其工作。
  • @Vaishali 这对我来说似乎很方便,但它也在替换内部字符串。我想替换endswith。下面是一些示例,其中代码结果如下:371 EAST PACES, LLC 更改为 371 EAST PCS, LLC HILL COUNTRY CHRISTIAN SCHOOL 更改为 HILL CONTRY CHRISTIAN SCHOOL ABC COLLIN na 更改为 ABC CoLIN NA -- 请建议
猜你喜欢
  • 1970-01-01
  • 2021-04-21
  • 2018-03-02
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多