Как в One Hot кодировать смешанные строки и значения числовых ячеек в pandas? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть наборы данных, в которых мне нужно выполнить одно горячее кодирование смеси различных материалов. Столбцы моего набора данных выглядят так:

id            Composition 
0             ZrB2 - 5% B4C
1    HfB2 - 15% SiC - 3% WC
2            HfB2 - 15% SiC

введите здесь описание изображения Мне нужно поместить его в следующем формате:

0)
ZrB2                                 95
HfB2                                  0
SiC                                   0
B4C                                   5
WC                                    0
1)
ZrB2                                  0
HfB2                                  82
SiC                                   15
B4C                                   0
WC                                    3
2)
ZrB2                                  0
HfB2                                  85
SiC                                   15
B4C                                   0
WC                                    0
WB                                    0

введите описание изображения здесь

1 Ответ

0 голосов
/ 06 августа 2020

Это не горячее кодирование как таковое, а анализ списка строк на составные части

  1. каждый компонент разделен знаком «-»
  2. каждый компонент состоит из двух частей: процент и имя столбца . Создайте re, который соответствует каждой из этих составляющих частей
  3. из list / dict понимания поместите его в фрейм данных
  4. полный лог 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'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...