Python Pandas映射lambda函数的不区分大小写字典
下面,我在函数中使用Python Pandas映射lambda函数的不区分大小写字典,python,python-2.7,pandas,lambda,Python,Python 2.7,Pandas,Lambda,下面,我在函数中使用lambda x:将值映射到pandas列(如果它们出现在字典基准中) 在该示例中,符号“GOOG”被映射为“Google”到列“全名” 我的问题是:如何根据dict进行不区分大小写的检查?例如,“Aapl”变成了“Apple”,即使“Aapl”在dict中 import pandas as pd import re df = pd.read_csv(file.csv, delimiter=",") df = pd.DataFrame(["LONG GOOG VON", "
lambda x:
将值映射到pandas
列(如果它们出现在字典基准中)
在该示例中,符号“GOOG”
被映射为“Google”
到列“全名”
我的问题是:如何根据dict进行不区分大小写的检查?例如,“Aapl”
变成了“Apple”
,即使“Aapl”
在dict中
import pandas as pd
import re
df = pd.read_csv(file.csv, delimiter=",")
df = pd.DataFrame(["LONG GOOG VON", "Long Aapl X4 VON"], columns=["symbol"])
benchmarks = {"GOOG": "Google", "AAPL": "Apple"}
match = re.compile(r"\s(\S+)\s")
def f(value):
f1 = lambda x: benchmarks[match.findall(x)[0]] if match.findall(x)[0] in benchmarks else ""
stuff = f1(value)
#stuff done here is omitted
return stuff
df["full_name"] = df["symbol"].map(lambda x:f(x))
编译匹配时使用re.IGNORECASE
,然后将匹配结果转换为字典的大写
import re
a = ["LONG GOOG VON", "Long Aapl X4 VON", 'no matches here']
match = re.compile(r"\s(\S+)\s", re.IGNORECASE)
benchmarks = {"GOOG": "Google", "AAPL": "Apple"}
for element in a:
s = match.search(element)
if s:
print(benchmarks.get(s.group(1).upper(), ''))
结果:
Google
Apple
怎么样flags=re.ignorecase
?此外,您可以考虑保存正则表达式搜索结果,而不是多次运行。如果lambda是函数中唯一的东西,为什么还要它呢?该函数甚至不返回任何内容。@TigerhawkT3,根据pandas文档,它应该与findall
一起工作,但我一定是做错了,因为当我以findall(x,flags=re.IGNORECASE)的形式输入时,它说“flags是该函数的无效关键字参数”
@TigerhawkT3这是完整代码的一部分。返回在别处进行。对于已编译的表达式,您必须在编译时而不是在搜索时放入标志,例如re.compile(r“\s(\s+)\s”,flags=re.IGNORECASE)
。啊,是的,我也尝试过。对symbol
中的单词进行了正则表达式匹配,但没有使用字典进行翻译。谢谢,我来看看这个。但我不确定这是否适用于索引列的方式(对于a=
)。另外,我可以在lambda函数中使用s
替代x
?s
只是一种避免多次正则表达式搜索字符串的方法。您的lambda
的x
相当于正在搜索的当前字符串元素。