我有如下所示的输入数据。这里的“性别”和“源自种族”是两列。我想用分类值替换它们的值1,2,3等。前-男1名,女2名
映射文件如下所示-示例2列
输入数据如下所示
我希望我的输出数据框看起来像这样
我尝试使用下面的代码来做到这一点。尽管代码可以正常运行,但我看不到任何替换发生的情况。你能帮我吗?
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.离婚等
期待您的帮助
答案 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)