我有如下所示的输入数据。这里的“性别”和“源自种族”是两列。我想用分类值替换它们的值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. ex开头的映射值:1. Single,2。已婚,3。离婚等
期待您的帮助
DataFrame.replace
与嵌套字典一起使用-第一个键定义替换的列名称,并通过函数创建另一个替换值Series.str.extract
:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句