2017-01-19 2 views
4

У меня есть проблема:панды соответствуют ДИКТ 'еще'

import pandas 

new_dict={ 
    'a':1, 
    'b':2, 
    'else':4 
} 
df=pandas.DataFrame([['new1','a'],['new2','b'],['new3','c'],['new4','d'],['new5','b']],columns=['new','id']) 

ФР как этот

new id 
0 new1 a 
1 new2 b 
2 new3 c 
3 new4 d 
4 new5 b 

В результате я хотел:

new id 
0 new1 1 
1 new2 2 
2 new3 4 
3 new4 4 
4 new5 2 

Я пытаюсь преобразовать Dict к кадру данных и использовать метод слияния. но «еще» не совпадает:

import pandas 

new_dict={'newid':['a','b','else'], 
     'idd':[1,2,4]} 
df2=pandas.DataFrame(new_dict,columns=['newid','idd']) 
df=pandas.DataFrame([['new1','a'],['new2','b'],['new3','c'],['new4','d'],['new5','b']],columns=['new','id']) 

Я пытаюсь использовать панда объединить метод, чтобы решить эту проблему, но я не знаю, что следующий шаг я должен делать. Благодаря!

ответ

3

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

df.id = df.id.map(new_dict).fillna(new_dict['else']).astype(int) 
print (df) 
    new id 
0 new1 1 
1 new2 2 
2 new3 4 
3 new4 4 
4 new5 2 

Другое решение с numpy.where:

df.id = np.where(df.id.isin(new_dict), df.id.map(new_dict), new_dict['else']).astype(int) 
print (df) 
    new id 
0 new1 1 
1 new2 2 
2 new3 4 
3 new4 4 
4 new5 2 
2

Вы можете использовать map с функцией а.
Я также использую словарь, который вы указали, но доступ к значениям через метод get, в котором вы можете указать значение по умолчанию.

def new(x): 
    new_dict = dict(a=1, b=2) 
    return new_dict.get(x, 4) 

df=pd.DataFrame([ 
    ['new1','a'],['new2','b'], 
    ['new3','c'],['new4','d'], 
    ['new5','b']], 
    columns=['new','id']) 


df.id = df.id.map(new) 

print(df) 

    new id 
0 new1 1 
1 new2 2 
2 new3 4 
3 new4 4 
4 new5 2 
Смежные вопросы