熊猫匹配字典'其他'

时间:2017-01-19 06:53:33

标签: python pandas dictionary

我遇到了问题:

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'])

像这样的df

    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转换为数据帧并使用merge方法。但'其他'不匹配:

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'])

我尝试使用pandas merge方法来解决这个问题,但我不知道下一步应该做什么。谢谢!

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分: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