Если все ваши исходные DataFrame
являются строками, вы можете сделать это:
ASD ASP TOF SVC OLIP
0 x Nan 1 3 x
1 Nan x Nan Nan x
2 Nan Nan x Nan 3
3 3 Nan Nan Nan x
d = {
1 : 'Trivial',
2 : 'Mild',
3 : 'Severe'
}
df.apply(lambda x: x.apply(lambda y: {**{str(k): '{}-{}'.format(x.name, v) for k, v in d.items()}, 'nan': 'Nan'}.get(y.lower(), x.name)))
ASD ASP TOF SVC OLIP
0 ASD Nan TOF-Trivial SVC-Severe OLIP
1 Nan ASP Nan Nan OLIP
2 Nan Nan TOF Nan OLIP-Severe
3 ASD-Severe Nan Nan Nan OLIP
Если нет, вы всегда можете привести тип к str
перед тем, как apply
второй слой:
df.apply(lambda x: x.astype(str).apply(lambda y: {**{str(k): '{}-{}'.format(x.name, v) for k, v in d.items()}, 'nan': 'Nan'}.get(y.lower(), x.name)))
Возможно, будет эффективнее, если вы сможете переопределить свой словарь раньше времени:
d = {**{str(k): '{{}}-{}'.format(v) for k, v in d.items()}, 'nan': 'Nan'}
# {'1': '{}-Trivial', '2': '{}-Mild', '3': '{}-Severe', 'nan': 'Nan'}
# Or if you want the final result to be actually np.nan:
d = {**{str(k): '{{}}-{}'.format(v) for k, v in d.items()}, 'nan': np.nan}
# On python 2.7 you need to do this instead:
d = {str(k): '{{}}-{}'.format(v) for k, v in d.iteritems()}
d['nan'] = np.nan
# Or just redefine 'd' manually:
d = {'1': '{}-Trivial', '2': '{}-Mild', '3': '{}-Severe', 'nan': np.nan}
# After 'd' is setup define a custom function
def func(val, name):
result = d.get(val.lower(), '{}')
if type(result) == str:
return result.format(name)
else:
return result
# call the custom function in the second layer of apply
df.apply(lambda x: x.astype(str).apply(lambda y: func(y.lower(), x.name)))
ASD ASP TOF SVC OLIP
0 ASD NaN TOF-Trivial SVC-Severe OLIP
1 NaN ASP NaN NaN OLIP
2 NaN NaN TOF NaN OLIP-Severe
3 ASD-Severe NaN NaN NaN OLIP