Одно горячее кодирование с помощью pandas очень просто:
def one_hot(df, cols):
"""
@param df pandas DataFrame
@param cols a list of columns to encode
@return a DataFrame with one-hot encoding
"""
for each in cols:
dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
df = pd.concat([df, dummies], axis=1)
return df
EDIT:
Другой способ one_hot использовать sklearn's LabelBinarizer
:
from sklearn.preprocessing import LabelBinarizer
label_binarizer = LabelBinarizer()
label_binarizer.fit(all_your_labels_list) # need to be global or remembered to use it later
def one_hot_encode(x):
"""
One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
: x: List of sample Labels
: return: Numpy array of one-hot encoded labels
"""
return label_binarizer.transform(x)
Так как вы используете Fragment
, я предполагаю, что вы используете версию> 16. В этом случае я думаю, что есть другой (возможно, лучший) способ решения этой проблемы, который возвращает массив массивов. Примерно так:
[
[
<div key='one'>foo</div>,
<div key='two'>bar</div>,
],
[
<div key='one'>foo</div>,
<div key='two'>bar</div>,
],
[
<div key='one'>foo</div>,
],
]
На самом деле это «эквивалентно» вашему «Решению B», но IMHO менее «хакерский», потому что я думаю , что Fragment
не предназначен для использоваться таким образом. Позвольте мне остановиться на этом:
До версии 16 функция рендеринга не могла возвращать массив React Elements, что было довольно раздражающим. В версии 16 это стало возможным, однако элементы массива должны всегда иметь key
, чтобы примиритель React работал должным образом, а это означает, что возвращать его из функции рендеринга плохо: это правильно:
[
<span key="firstSpan">foo</span>,
<span key="secondSpan">bar</span>,
]
Но делать это немного странно и раздражает. Вот почему было изобретено Fragment
, так что мы можем просто вернуть это:
<Fragment>
<span>foo</span>
<span>bar</span>
</Fragment>
Итак, большое преимущество Fragment
состоит в том, что нам не нужно назначать keys
их дочерним элементам , Вот почему я нахожу немного странным видеть Fragment
с «ключами» детей.
Кроме того, я хотел сказать, что не думаю, что с вашим «вариантом А» что-то не так. Тем не менее, я думаю, что в большинстве случаев решение, которое я предлагаю, будет намного легче реализовать.
Правильность использования в качестве ключа зависит от того, что может измениться в течение жизненного цикла родительского компонента (FillScreen
).
Использование индекса в качестве ключа обычно не одобряется, потому что если items
изменения реквизита в течение жизненного цикла FillScreen
, то тот же индекс теперь может указывать на другой элемент, но компонент не будет повторно отображаться, потому что ключ остается тот же самый.
В этом случае вы можете просто использовать комбинацию id
и index
в качестве ключа, но имейте в виду, что если элементы будут перетасованы в массиве, то компоненты для представления каждого элемента будут перемонтированы. То же самое относится и к другому подходу, использующему ключи индекса для фрагментов (здесь нет особого преимущества использования фрагментов).
Аналогично, если вы вставляете элемент между массивом, то компоненты для представления всех последующих элементов будут отброшены и воссозданы.
Если вы хотите оптимизировать для вышеупомянутых случаев, вы можете создать ключ, добавив индекс вхождения этого идентификатора.
<div class="fill-screen">
<div key="one-0">foo</div>
<div key="two-0">bar</div>
<div key="one-1">foo</div>
<div key="two-1">bar</div>
<div key="one-2">foo</div>
<div key="two-2">bar</div>
<div key="one-3">foo</div>
</div>
Элементы React довольно легкие, поэтому клонирование не требует значительных накладных расходов.