使用带有 python/pandas 的 dict 理解与 str.contains 进行部分字符串匹配

Posted

技术标签:

【中文标题】使用带有 python/pandas 的 dict 理解与 str.contains 进行部分字符串匹配【英文标题】:Partial string match with str.contains using dict comprehension with python/pandas 【发布时间】:2018-10-10 18:17:36 【问题描述】:

我有一个数据框,其中有一列名为 course_names 的映射字典,其中包含我想在键中匹配的课程名称列表以及我想在值列中分配的值

import pandas as pd
df = pd.DataFrame('course_name' : ['Phsyics, Maths','Algebra & Maths','History','Geology','Biology'])


mapping = 'Algebra & Maths' : 'Mathematics',
'Phsyics' : 'Science',
'History' : 'History',
'Geology' : 'Geology',
'Biology' : 'Science' 
# this goes on for about another 35 lines. 

#my attempt so far.

df['keys'] = [k for k, v in mapping.items() if df['course_name'] in k]

当我运行这段代码时,我得到:

TypeError: 'in <string>' requires string as left operand, not Series

预期输出:

    course_name          key
0   Phsyics, Maths      Science
1  Algebra & Maths  Mathematics
2          History      History
3          Geology      Geology
4          Biology      Science

【问题讨论】:

【参考方案1】:

你有一个小的语法错误。你也可以使用map

试试:

import pandas as pd
df = pd.DataFrame("course_name" : ["Algebra & Maths", "Phsyics"])
Mapping = 'Algebra & Maths' : 'Mathematics','Phsyics' : 'Science'
df["keys"] = [v for k, v in Mapping.items() if k in df['course_name'].tolist()]
#df["keys"] = df["course_name"].map(Mapping)
print(df)

输出:

       course_name         keys
0  Algebra & Maths  Mathematics
1          Phsyics      Science

【讨论】:

谢谢!这并没有在我的帖子中给我所需的输出(不清楚吗?)我需要将课程名称与键匹配并返回值。 更新了 sn-p。 谢谢!我现在收到错误:值的长度与索引的长度不匹配我需要应用 pd.series 吗? 对不起,我不明白?这只是给了我一整列 NaN Length of values does not match length of index这个错误是因为DF["course_name"]中的key-value不匹配

以上是关于使用带有 python/pandas 的 dict 理解与 str.contains 进行部分字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas dict 到数据框(不工作)

python pandas数据框列转换为dict键和值

Python Pandas 系列 if else 箱线图

[python][pandas]DataFrame的基本操作

Python pandas绘制带有间隙的时间序列

python3 + Pandas 样式 + 更改备用行颜色