【问题标题】:Case insensitive dictionary for Pandas map lambda functionPandas map lambda 函数的不区分大小写的字典
【发布时间】:2015-06-29 22:04:30
【问题描述】:

下面,如果它们出现在字典 benchmarks 中,我在 map 列的 map 函数中使用 lambda x: 值。

在示例中,符号 "GOOG" 被映射为 "Google" 到列 "full_name"。

我的问题是:如何对字典进行不区分大小写的检查?例如,"Aapl" 变为 "Apple",即使 "AAPL" 在字典中。

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))

【问题讨论】:

  • flags=re.ignorecase 怎么样?此外,您可能会考虑保存正则表达式搜索结果,而不是多次运行它。如果它是函数中唯一的东西,为什么你甚至需要一个 lambda?该函数甚至没有 return 任何东西。
  • @TigerhawkT3 根据 pandas 文档,这应该与 findall 一起使用,但我一定做错了,因为当我输入 findall(x, flags=re.IGNORECASE) 时,它说 'flags is an invalid keyword argument for this function'
  • @TigerhawkT3 这是完整代码的一部分。退货在其他地方进行。
  • 对于已编译的表达式,您必须在编译时而不是在搜索时放入标志,例如re.compile(r"\s(\S+)\s", flags=re.IGNORECASE).
  • 啊,是的,我也尝试过。对symbol 中的单词进行了正则表达式匹配,但不使用字典进行翻译。

标签: python python-2.7 pandas lambda


【解决方案1】:

编译匹配时使用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

【讨论】:

  • 谢谢,我会看看这个。但我不确定这是否适用于 pandas 键列的方式(对于a =)。另外,我可以在我的 lambda 函数中使用 s 代替 x 吗?
  • s 只是一种避免多次正则表达式搜索字符串的方法。您的lambda 的x 等同于element,即正在搜索的当前字符串。
猜你喜欢
  • 2020-02-18
  • 2018-12-30
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2012-12-09
相关资源
最近更新 更多