【问题标题】:Python str.contains from two or more dictionariesPython str.contains 来自两个或多个字典
【发布时间】:2015-09-09 19:04:20
【问题描述】:

我想检查一个字符串是否包含来自两个字典的一个或多个值。

company = {"AXP": "American Express", "BIDU": "Baidu"}
stock_index = {"GOOG": "Google"}

for c, i in zip(company, stock_index):
    df.loc[df.name.str.contains(c, i), "instrumentclass"] = "Equity"

由于某种原因,它只为字典中的第一个匹配项写入"Equity",即"AXP":"American Express"。对于"Baidu""Google",没有任何反应。

我知道我可以将字典合二为一,如下所示,但我不想这样做。

benchmarks = company.copy()
benchmarks.update(stock_index)

pandas DataFrame 的帮助下写入和检索数据。

import pandas as pd
df = pd.DataFrame(["LONG AXP", "SHORT AXP", "LONG BIDU", "LONG GOOG"], columns=["name"])

代码将name 列复制到instrumentclass 列,如果每个单元格包含"AXP""BIDU""GOOG",则应该将其替换为"Equity"

【问题讨论】:

  • df 是什么?请写一个最小的工作示例。
  • df 是 Pandas 数据帧。我很快就会用一个工作示例更新这个问题。
  • 来自zip():的文档返回的列表长度被截断为最短参数序列的长度
  • @boardrider 啊,这就是它不起作用的原因。有没有办法让它检查两个字典而不合并它们?
  • 遍历所有字典,检查值是否存在。

标签: python python-2.7 dictionary pandas


【解决方案1】:

为什么不从分解这些数据开始,如下所示:

df = pd.DataFrame(["LONG AXP", "SHORT AXP", "LONG BIDU", "LONG GOOG"],
                  columns=["name"])

# split on spaces and get the last part
df["company_name"] = df.name.str.split().str.get(-1)

>>> print df
        name company_name
0   LONG AXP          AXP
1  SHORT AXP          AXP
2  LONG BIDU         BIDU
3  LONG GOOG         GOOG

现在,使用这些字符串要容易得多。鉴于这是您的字典示例:

company = {"AXP": "American Express", "BIDU": "Baidu"}
stock_index = {"GOOG": "Google"}

您可以利用类似于 Python 中的集合的“字典视图”:

# this is Python 2, if you use Python 3, .keys() method returns a view
all_companies = company.viewkeys() | stock_index.viewkeys()

>>> print all_companies
{'AXP', 'BIDU', 'GOOG'}

所以现在,我们有一个类似集合的对象,我们可以使用它来过滤数据并设置“Equity”:

df.loc[df.company_name.isin(all_companies), "instrumentclass"] = "Equity"

如果您担心不加入这样的字典,您可能需要考虑使用 ChainMap 之类的东西:https://docs.python.org/3/library/collections.html#collections.ChainMap 这是 Python 3 标准库,但应该存在向后移植到 Python 2。

【讨论】:

  • 谢谢,只是跟进:如果我在name中有两个以上的单词,我该如何拆分它并使用最后两个单词?对于LONG AXP VOX,类似str.get(-2:)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多