Это не горячее кодирование как таковое, а анализ списка строк на составные части
- каждый компонент разделен знаком «-»
- каждый компонент состоит из двух частей: процент и имя столбца . Создайте re, который соответствует каждой из этих составляющих частей
- из
list
/ dict
понимания поместите его в фрейм данных - полный лог c для вычисления% возраста столбца, где он не был определено
data = ['ZrB2 - 5% B4C', 'HfB2 - 15% SiC - 3% WC', 'HfB2 - 15% SiC']
dfhc = pd.DataFrame({"Composition":data})
# build a list of dict, where dict is of form {'ZrB2': -1, 'B4C': '5'}
# where no %age, default to -1 to be calculated later
parse1 = [{tt[1]:tt[0].replace("% ","") if len(tt[0])>0 else -1
for t in r
# parse out token and percentage, exclude empty tuples (default behaviour of re.findall())
for tt in [x for x in re.findall("([0-9]*[%]?[ ]?)([A-Z,a-z,0-9]*)",t) if x!=("","")]
}
# each column is delimited by " - "
for r in [re.split(" - ",r) for r in dfhc["Composition"].values]
]
df = pd.DataFrame(parse1)
# dtype is important for sum() to work
df = df.astype({c:np.float64 for c in df.columns})
# where %age was not known and defaulted to -1 set it to 100 - sum of other cols
for c in df.columns:
mask = df[df[c]==-1].index
df.loc[mask, c] = 100 - df.loc[mask, [cc for cc in df.columns if cc!=c]].sum(axis=1)
print(f"{dfhc.to_string(index=False)}\n\n{df.to_string(index=False)}\n\n{parse1}")
вывод
Composition
ZrB2 - 5% B4C
HfB2 - 15% SiC - 3% WC
HfB2 - 15% SiC
ZrB2 B4C HfB2 SiC WC
95.0 5.0 NaN NaN NaN
NaN NaN 82.0 15.0 3.0
NaN NaN 85.0 15.0 NaN
[{'ZrB2': -1, 'B4C': '5'}, {'HfB2': -1, 'SiC': '15', 'WC': '3'}, {'HfB2': -1, 'SiC': '15'}]