2015-06-23 4 views
1

Я хочу проверить, содержит ли строка одно или несколько значений из двух словарей.Python str.contains из двух или более словарей

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".

+0

Что такое 'df'? Пожалуйста, напишите минимальный рабочий пример. –

+0

df - это DataFrame Pandas. Я кратко расскажу об этом с рабочим примером. – Winterflags

+1

Из документации для 'zip():' * Возвращаемый список усечен по длине с длиной кратчайшей последовательности аргументов * – boardrider

ответ

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

Так что теперь у нас есть подобный набор объектов можно использовать для фильтрации данных и набор «Справедливость»:

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

Если вы обеспокоены тем, не присоединяющиеся этих словарей, как это, вы, возможно, захотите рассмотреть возможность использования что-то вроде ChainMap: https://docs.python.org/3/library/collections.html#collections.ChainMap Это стандартная библиотека Python 3, но backports для Python 2 должны существовать.

+0

Спасибо, просто продолжение: если у меня есть более двух слов в 'name', как я могу разделить его и использовать два последних слова вместе? Для 'LONG AXP VOX', что-то вроде' str.get (-2:) '? – Winterflags

Смежные вопросы