Python str.contains来自两个或多个词典

时间:2015-06-23 19:38:32

标签: python python-2.7 dictionary pandas

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

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,如果它包含"Equity""AXP",则应将每个单元格替换为"BIDU""GOOG"

1 个答案:

答案 0 :(得分:1)

为什么不首先分解这些数据,如下所示:

this.props.bossData.head.map(function(item) {
  return <a onClick={this.props.handleClick.bind....} //You fill in the rest
}, this);

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

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

您可以利用“dictonary views”,其行为类似于Python中的集合:

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

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

# 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'}

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