将数据框中的值替换为另一个数据框中的值-Regex

时间:2019-05-30 07:32:38

标签: python python-3.x pandas dataframe replace

我有如下所示的输入数据。这里的“性别”和“源自种族”是两列。我想用分类值替换它们的值1,2,3等。前-男1名,女2名

映射文件如下所示-示例2列

enter image description here

输入数据如下所示

enter image description here

我希望我的输出数据框看起来像这样

enter image description here

我尝试使用下面的代码来做到这一点。尽管代码可以正常运行,但我看不到任何替换发生的情况。你能帮我吗?

mapp = pd.read_csv('file2.csv')
data = pd.read_csv('file1.csv')
for col in mapp:
    if col in data.columns:
        print(col)
        s = list(mapp.loc[(mapp[col].str.contains('^\d')==True)].index)
        print("s is",s)
        for i in s:
           print("i is",i)
            try:
               value = mapp[col][i].split('. ')
               print("value 0 is",value[0])
               print("value 1 is",value[1])
               if value[0] in data[col].values:
               data.replace({col:{value[0]:value[1]}})
            except:
                print("column not present")
   else:
       print("No")

请注意,我只显示了两列,但实时显示可能超过600列。任何简单的优雅方法/建议都将有所帮助。由于我有两个单独的csv文件,因此有关合并/连接等的任何建议也将有所帮助,但请注意,我的映射文件包含的值为“ 1. Male”,“ 2。Female”。因此我使用了正则表达式

还请注意,其他几个列值也可以具有以1.开头的映射值,例如:1.单身,2.已婚,3.离婚等

期待您的帮助

2 个答案:

答案 0 :(得分:3)

documentation与嵌套字典一起使用-第一个键定义要替换的列名称,而另一个键由函数DataFrame.replace创建的替换值:

df = pd.DataFrame({'Gender':['1.Male','2.Female', np.nan],
                   'Ethnicity':['1.Chinese','2.Indian','3.Malay']})
print (df)
     Gender  Ethnicity
0    1.Male  1.Chinese
1  2.Female   2.Indian
2       NaN    3.Malay

d={x:df[x].str.extract(r'(\d+)\.(.+)').dropna().set_index(0)[1].to_dict() for x in df.columns}
print (d)
{'Gender': {'1': 'Male', '2': 'Female'}, 
 'Ethnicity': {'1': 'Chinese', '2': 'Indian', '3': 'Malay'}}

df1 = pd.DataFrame({'Gender':[2,1,2,1],
                   'Ethnicity':[1,2,3,1]})
print (df1)
   Gender  Ethnicity
0       2          1
1       1          2
2       2          3
3       1          1

#convert to strings before replace
df2 = df1.astype(str).replace(d)
print (df2)
   Gender Ethnicity
0  Female   Chinese
1    Male    Indian
2  Female     Malay
3    Male   Chinese

答案 1 :(得分:1)

如果条目总是按顺序排列(let buildcost = 25.00; function updateTotal() { let radios = document.getElementsByName('config-prod'); let select = document.getElementById('plist'); let partcost = 0; for (let i = 0, j = radios.length; i < j; i++) { if (radios[i].checked) { partcost = parseFloat(radios[i].value); break; } } partcost += parseFloat(select.options[select.selectedIndex].value); let total_cost = buildcost + partcost; document.getElementById('total').value = total_cost.toFixed(2); } ),请使用:

1.XXX,2.XXX...

m=df1.apply(lambda x: x.str[2:])
n=df2.sub(1).replace(m)
print(n)