【问题标题】:Can we to refer to a dictionary get a value from the key while replacing in Python?在 Python 中替换时,我们可以引用字典从键中获取值吗?
【发布时间】:2019-10-17 08:29:48
【问题描述】:

我有一个包含术语和句子的平面文件。如果在句子中找到任何术语,我需要将其 id 附加到术语 (term|id) 中。模式匹配应该不区分大小写。此外,我们需要保留与句子中相同的大小写。是否可以在替换调用中使用它的键来引用字典来获取值?

from pandas import DataFrame
import re

df = {'id':[11,12,13,14,15,16],
    'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
        'sentence': ['F-FORD FORD/FORD is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
        }
#Dataframe creation
df = DataFrame(df,columns= ['id','term','sentence'])

#Dictionary creation
dict = {}
l_term = list(df['term'])
l_id = list(df['id'])

for i,j in zip(l_term,l_id):
    dict[str(i)] = j

#Building patterns to replace
pattern = r'(?i)(?<!-)(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(df["term"],key=len,reverse=True))))

#Replace
df["sentence"].replace(pattern, r"\g<0>|present",, inplace=True,regex=True)

而不是 |present 我需要参考像 |dict.get(\g) 这样的字典,或者有没有其他方法可以实现这一点?此外,如果我们为 16,17 找到两次汽车。我们可以附加任何一个。

预期的结果是

F-FORD FORD|11/FORD|11 is less expensive|12 than Mercedes Benz|14.
toyota|13, hyundai mileage is good compared to ford|11
tesla is an electric|15-car
toyota|13 too has electric|15 cars|16
CARS|16
CArs|16 are expensive|12.

【问题讨论】:

  • 我们应该检查字典键是否存在?如果给定的 dict 键不存在怎么办?
  • 如果我们有一个term(value),它总是会有一个key。

标签: python pandas dataframe dictionary pattern-matching


【解决方案1】:

您可以对当前代码稍作修改:

from pandas import DataFrame
import re

df = {'id':[11,12,13,14,15,16],
    'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
        'sentence': ['F-FORD FORD/FORD is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
        }
#Dataframe creation
df = DataFrame(df,columns= ['id','term','sentence'])

#Dictionary creation
dct = {}
l_term = list(df['term'])
l_id = list(df['id'])

for i,j in zip(l_term,l_id):
    dct[str(i).upper()] = j

#Building patterns to replace
pattern = r'(?i)(?<!-)(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(df["term"],key=len,reverse=True))))

#Replace
df["sentence"]=df["sentence"].str.replace(pattern, lambda x: "{}|{}".format(x.group(),dct[x.group().upper()]))

注意事项

  • dict 是保留名称,不要命名变量dict,使用dct
  • dct[str(i).upper()] = j - 将大写的键添加到字典中,以启用字典中的键不区分大小写的搜索
  • df["sentence"]=df["sentence"].str.replace(pattern, lambda x: "{}|{}".format(x.group(),dct[x.group().upper()])) 是主(最后)行,它使用 Series.str.replace 允许使用可调用作为替换参数,一旦模式匹配,匹配将作为 x 匹配对象传递给 lambda 表达式,其中检索值使用dct[x.group().upper()] 并使用x.group() 访问整个比赛。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多