在pandas dataframe上使用.replace()方法时,在字典中重叠键

Nir*_*van 11 python pandas

我想使用将旧代码映射到新代码的字典替换数据框列中的某些值.

di = dict( { "myVar": {11:0, 204:11} } )
mydata.replace( to_replace = di, inplace = True )
Run Code Online (Sandbox Code Playgroud)

但是一些新代码和旧代码重叠.当使用数据帧的.replace方法时,我遇到错误'Replacement not allowed with overlapping keys and values'

我目前的解决方法是手动替换替换违规密钥,然后将字典应用于剩余的非重叠案例.

mydata.loc[ mydata.myVar == 11, "myVar" ] = 0 
di = dict( { "myVar": {204:11} } )
mydata.replace( to_replace = di, inplace = True )
Run Code Online (Sandbox Code Playgroud)

有更紧凑的方法吗?

Nir*_*van 12

我在这里找到了一个答案,它将一个系列中的.map方法与字典结合使用.这是一个具有重叠键和值的重新编码字典的示例.

import pandas as pd
>>> df = pd.DataFrame( [1,2,3,4,1], columns = ['Var'] )
>>> df
   Var
0    1
1    2
2    3
3    4
4    1
>>> dict = {1:2, 2:3, 3:1, 4:3}
>>> df.Var.map( dict )
0    2
1    3
2    1
3    3
4    2
Name: Var, dtype: int64
Run Code Online (Sandbox Code Playgroud)

更新:

使用map,原始系列中的每个值都必须映射到新值.如果映射字典不包含原始列的所有值,则未映射的值将映射到NaN.

>>> df = pd.DataFrame( [1,2,3,4,1], columns = ['Var'] )
>>> dict = {1:2, 2:3, 3:1}
>>> df.Var.map( dict )
0    2.0
1    3.0
2    1.0
3    NaN
4    2.0
Name: Var, dtype: float64
Run Code Online (Sandbox Code Playgroud)