将字典中的键与字符串匹配

3

大家好!

这里是关于IT技术的内容。
dict = {'Awesome' : 'Sauce', 'Foo' : 'Barr'}

Col A Col B
1     'This is Awesome'
2     'I really foo him' 

我正在尝试找到最符合Python风格的方法来迭代数据集/框架,并返回与字典值匹配的任何字符串。
例如,对于第一项,我想返回列c中的“Sauce”,对于第二项,在相应的行中但在列c中返回“barr”。
如果有必要,我正在处理CSV / Excel文件。
感谢任何帮助。我很高兴使用Pandas和NP库。
ID     Name of Course
0      Super Event Training: English Event...
1      Start with our Maths Training...
2      Live online Biology Training...
3      Maths throughout time...
4      Online Q&A Webinar: History..
5      Start with our Creative ...
6      Spring Conf with Author
7      Physics in our age ...
8      Spring Conf
9      Start with our educational items...
10     Education delivery in India...
11     English IELTS, Access to University..
12     Our Core Products for Empowerment..

我有一个类似这样的DF,大约有500行,我正在使用API进行爬取,需要将此自由格式文本转换为我的字典中的值。我已经识别出关键词并将其放入我的键值中,并分配给字典值,以便我们可以分析数据。

也许使用字典不是做这件事情的最佳方式?任何建议将不胜感激。

DN.


5
一个小提示:不要将一个字典命名为dict。请注意避免使用Python内置函数和关键字作为变量名。 - BENY
我在这里是个新手,这是我尝试使用pandas和python的第一周左右!@Wen-Ben - 刚刚回来使用这段代码,谢谢老兄 =) - Umar.H
4个回答

4
您可以仅使用Python来完成此任务。
[''.join(z) for z in [[y[1] if y[0] in x  else '' for x in df['Col B'] ] for y in d.items()]]
Out[22]: ['Sauce', 'Barr']

这个工作得非常好!你有什么想法如何将这些值附加到不同列上匹配的行上吗? - Umar.H
这是我的第一步,但我收到了这个错误:值的长度与索引的长度不匹配。 - Umar.H
@Datanovice,你能打印出列表的长度和数据框的长度吗? - BENY
我只是在测试,因为我的工作笔记本电脑在公司,但该文件将包含x行和40列。这些数据来自我正在测试的网络爬取/ API服务,并且我需要对齐这些数据以适应我们的数据库。(如果这让您感觉更好地帮助,这是为一个非营利慈善机构) - Umar.H
嘿,伙计,我为你编辑了我的答案,希望我的问题清楚明了! - Umar.H

2

如果您可以逐行读取csv文件(或将其拆分为可以访问列b中的值的部分),下面的代码将为您提供与字典中的关键字匹配的列B中句子中所有值的列表。

word_dict = {'Awesome' : 'Sauce', 'Foo' : 'Barr'}
s1 = 'This is Awesome'
matches = [x for x in s1.split() if x in dict.keys()]
>> matches = ['Awesome']

它的工作原理是使用 string.split() 将句子分割成单词。然后列表推导式遍历生成的单词列表,并检查它是否是字典中的键,如果是键,则将其添加到新列表中,如果不是键,则忽略它。


啊!答案看起来如此简单而优雅,谢谢!我现在正在移动中,但回家后会测试一下! - Umar.H

1
像这样的东西?
def get_col3(text,d):
    ret = ""
    keys = list(d.keys())
    vals = list(d.values())
    for key in keys:
        if key.lower() in text.lower():
            idx = keys.index(key)
            ret+=vals[idx]+" "
    return ret

d = {'Awesome' : 'Sauce', 'Foo' : 'Barr'}

text1 = 'This is Awesome'
text2 =  'I really foo him'
text3 =  'That was Awesome foo to him'

print(get_col3(text3,d))

1
如果您想显式迭代字典和数据帧,则可以使用以下方法:
mapper = {'Awesome' : 'Sauce', 'Foo' : 'Barr'}

data = {"Col B": ["This is Awesome", "I really foo him"]}

df = pd.DataFrame(data)

for item in mapper:
    for i in range(len(df)):
        if item.lower() in df["Col B"].iloc[i].lower():
            print(mapper[item])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接