我有以下简单问题,假设我有以下数据框:
df = pd.DataFrame({'A': ['foo', 1, 2, 3, 4],
'B': [5, 'dude', 7, 8, 9],
'C': ['5', '5', 'dude', '5', '5']})
print(df)
A B C
0 foo 5 5
1 1 dude 5
2 2 7 dude
3 3 8 5
4 4 9 5
现在,我想分别用各自的唯一值替换A,B和C列中的值['foo','dude','dude']
。我可以使用pandas replace
函数来完成此操作。
df['A'] = df['A'].replace('foo', value = 68 ).astype(float)
df['B'] = df['B'].replace('dude', value = 46).astype(float)
df['C'] = df['C'].replace('dude', value = 86).astype(float)
这可行,但是我知道以前在我编写的许多代码中,存在一种更简单有效的方法来解决类似问题。我有一种直观的感觉,认为有更好的方法可以完成此操作,但是我不确定它可能是什么。
这是我尝试过的。
dict1={'A':{'foo':68},'B':{'dude': 46}, 'C':{'dude':86}}
dfclean = df.replace(dict1)
但无济于事。用它们各自的行替换它们是最有效的方法吗?
编辑:
哇,我是个傻瓜……我在上面写的解决方案确实有效,我只是打印df,而不是dfclean。谢谢。
答案 0 :(得分:0)
如果要替换的值很多,则map()比.replace更快(对我来说是100倍)。不利之处在于,使用map时,没有正则表达式可用于替换子字符串-如果需要的话。
看看这是否对您有用:
# Map the dictionary to the whole dataframe
df= df.map(dict1).fillna(df)
在此处使用fillna可以防止在未替换行的情况下显示NaN。