2015-06-20 2 views
1

я в настоящее время отображения и переименования различных строковых значений столбцов в pandas с помощью этой функции:Панды карта для DataFrame из словаря

df["fundbenchmark"] = df["name"].map(lambda x: "American Express" if "AXP" in x else "Apple" if "AAPL" in x else "Google" if "GOOG" in x else "") 

Я, однако сделать это в течение нескольких колонок и для многих различных переименований. Вот еще один столбец с идентичным контентом, поэтому было бы повторительно добавлять туда все компании.

df["subclass"] = df["name"].map(lambda x: "American Express" if "AXP" in x else "Apple" if "AAPL" in x else "Google" if "GOOG" in x else "") 

Таким образом, я хотел бы сохранить словарь, как:

companies = {"AXP": "American Express", "AAPL": "Apple", "GOOG": "Google"} 

и называют, что для всех случаев, когда мне нужно отобразить названия компании. Как я могу сделать это map для совпадений в companies вместо lambda x?


Текущий DataFrame:

Name    
"BULL AXP UN X3 VON" 
"BEAR AXP UN X3 VON" 
"BULL GOOG UN X5 VON" 
"BEAR GOOG UN X5 VON" 
"BEAR ABC123 X2 CBZ" 

Желаемый результат:

Name     Fundbenchmark    Subclass 
"BULL AXP UN X3 VON"  "American Express"  "American Express" 
"BEAR AXP UN X3 VON"  "American Express"  "American Express" 
"BULL GOOG UN X5 VON"  "Google"    "Google" 
"BEAR GOOG UN X5 VON"  "Google"    "Google" 
"BEAR ABC123 X2 CBZ"  "BEAR ABC123 X2 CBZ" "BEAR ABC123 X2 CBZ" #Not in Dictionary 

Словарь:

companies = {"AXP": "American Express", "GOOG": "Google"} 

Так что если аббревиатура существует в словаре, а затем написать это имя для других столбцов ,

Или, если аббревиатура отсутствует в словаре, дублируйте всю ячейку.

+1

@JohnE К сожалению об этом. Я отредактировал вопрос для большей ясности. – Winterflags

+0

Не стоит беспокоиться, теперь это намного яснее. – JohnE

ответ

1

Я сомневаюсь, что это самый элегантный способ, но он должен сделать трюк:

df['fbm'] = df['name'] 
for i in companies: 
    df.loc[ df.name.str.contains(i), 'fbm' ] = companies[i] 

        name     fbm 
0 BULL AXP UN X3 VON American Express 
1 BEAR AXP UN X3 VON American Express 
2 BULL GOOG UN X5 VON    Google 
3 BEAR GOOG UN X5 VON    Google 
4 BEAR ABC123 X2 CBZ BEAR ABC123 X2 CBZ 

Одна вещь, чтобы иметь в виду, здесь является то, что, так как это не поиск по словарю, вы могли бы иметь более одного матча. Например, «ABC» и «UN» являются действительными тикерами, а «BEAR» - или был. С помощью этого метода последнее совпадение будет сохранено и любые предыдущие совпадения будут отброшены.

+0

Спасибо, попробуем это. 'np.where' импортируется из' numpy' правильно? – Winterflags

+0

@Winterflags - да, np является numpy. Но на самом деле я просто заменил эту строку, используя 'loc' вместо' np.where', вероятно, более стандартный способ сделать это. Я думаю, что 'str.contains (i)' является настоящим ключом. Помимо этого существует несколько разных способов сделать эту строку, включая 'loc' и' np.where' – JohnE

+0

Спасибо, таким образом мне также не пришлось импортировать numpy. Это работает сейчас! Большое спасибо за помощь :) – Winterflags

1

Использование Replace:

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.replace.html

df = pd.DataFrame({'A':['string1','string2','string3'], 
       'B':['StringA','StringB','StringC']}) 

Создает:

   A  B 
    0 string1 StringA 
    1 string2 StringB 
    2 string3 StringC 

Затем сопоставить замены в словаре:

to_replace = {'string1':'replace1','StringC':'replaceC'} 

Затем замените:

df.replace(to_replace) 
      A   B 
0 replace1 StringA 
1 string2 StringB 
2 string3 replaceC 
+0

Спасибо за предложение. Это заменит все экземпляры, определенные в словаре, но это не исключает остальную строку как «.map (lambda x:« American Express », если« AXP »в x else» «». Могу ли я заменить rest – Winterflags

+0

Попробуйте следующее: df.applymap (lambda x: x if x in to_replace.keys() else '') –

+0

Я думаю, что мы на правильном пути, но я получаю объект AttributeError: 'Series' не имеет атрибута 'applymap''. – Winterflags

2

Вы можете использовать map

Current DataFrame: 

Name    
"BULL AXP UN X3 VON" 
"BEAR AXP UN X3 VON" 
"BULL GOOG UN X5 VON" 
"BEAR GOOG UN X5 VON" 
"BEAR ABC123 X2 CBZ" 


companies = {"AXP": "American Express", "GOOG": "Google"} 

мы создаем новый столбец, который извлечет линеечку из вашей колонки.

df['Tickers'] = df.Name.str.split(' ').apply(lambda x: x[1]) 

Затем мы используем карту свой словарь companies в тикеров создать столбец с именами тикер:

df['Ticker_Name'] = df['Tickers'].map(companies) 
Смежные вопросы