【问题标题】:Replace string values in a dataframe by using a dictionary使用字典替换数据框中的字符串值
【发布时间】:2020-02-15 08:28:07
【问题描述】:

我有一个数据框,其中有一列名为“cleaned_tweet”。本专栏由带有几个缩写的推文组成,我想用适当的英文单词替换这些缩写。为此,我准备了一本名为“俚语”的字典,其中缩写。是键和所需的英语短语/单词作为值,我想替换所有出现的那些缩写。与他们在字典中的值。我已经在 stackoverflow 上寻找了其他几个解决方案,但它们似乎都没有工作。这是我尝试过的。我正在使用嵌套的 for 循环,我相信我非常接近解决方案,但我做错了什么,我似乎无法弄清楚。

这是嵌套循环:

for i in range(len(train_test_set)):
    for j in slangs:
        train_test_set['cleaned_tweet'][i] = train_test_set['cleaned_tweet'][i].replace(j, slangs[j])

当我执行此代码并打印 print(train_test_set['cleaned_tweet][0]) 时,我得到了一个意外的输出,如下所示:

"#mopanthank whyour | hi | years oldwhyour | hi | years oldhesitationospecial editekissas insekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye rainbowhwhy | would whyour | hi | years olduohesitationents | rapper from atalk later | ekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye rainbowhwhy | would whyour | hi | years olduoue loversatileionwhyes | yeah | yes | your | hi | years oldu | team leaderantaonwhysomethingop it | somethingwhyour | hi | years oldupid idiotake careal edwhyour | hi | years olducatekissas insekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye..."

似乎许多不需要的值被附加到单元格中。 输出的大小真的很大,这里不能全部复制。这是执行代码之前我的数据集和字典的结构:

谁能告诉我我做错了什么?

【问题讨论】:

标签: python regex python-3.x loops dataframe


【解决方案1】:

您可以尝试将字典与 map() 函数一起使用。像这样的:

slangs = {'abbr1': 'word1', .........}
train_test_set['cleaned_tweet'] = train_test_set['cleaned_tweet'].map(slangs)

如果您对同一个单词有多个缩写,您可以尝试使用单词作为键,将各个缩写的列表作为值来定义字典。然后,您可以交换键和值并遵循相同的方法。像这样的:

# define the dictionary with the words as the keys and the lists of the respective abbreviations as the values
slangs = {'word1': ['abbr11', 'abbr12', ....], 'word2': ['abbr21', 'abbr22',..]}
#swap keys in slangs: http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in slangs.items() for k in oldv}
train_test_set['cleaned_tweet']  = train_test_set['cleaned_tweet'].map(slangs)

【讨论】:

    【解决方案2】:

    我建议使用支持可调用作为替换参数的Series.str.replace 方法。

    首先,定义一个字典,其中键是搜索表达式,值是要替换的文本:

    slangs = { 'lng1': 'val1', 'lng2': 'val2' }
    

    然后,使用

    rx = r'\b(?:{})\b'.format("|".join(slangs.keys())
    train_test_set['cleaned_tweet'] = train_test_set['cleaned_tweet'].str.replace(rx), lambda x: slangs[x.group()])
    

    这里,rx 将是一个动态形成的\b(?:abc|def|ghi|...)\b 类型的正则表达式,其中\b 是单词边界。如果您的搜索词由字母、数字或下划线组成,这将起作用。请参阅此动态模式构建的other variations 以涵盖更多场景。找到匹配项后,将其传递给 lambda 表达式,lambda x: slangs[x.group()] 返回找到的键的字典值。

    如果您有数千个字典项,请使用this solution 构建正则表达式树。

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2017-07-15
      • 2022-01-15
      • 2020-04-25
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多