![](/img/trans.png)
[英]Using str.contains to look for two substrings with pandas in python
[英]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.