簡體   English   中英

Python str。包含兩個或多個字典

[英]Python str.contains from two or more dictionaries

我想檢查一個字符串是否包含兩個字典中的一個或多個值。

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"

為什么不從分解這些數據開始,像這樣:

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

因此,現在,我們有了一個類似集合的對象,可以用來過濾數據並設置“股票”:

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的反向移植。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM