[英]rank hot encoding python3
我想用秩熱編碼而不是單熱編碼處理熊貓數據幀。
例如,以以下熊貓數據框為例:
df = pd.DataFrame([[1,2],[3,2],[2,2]], columns=['colA', 'colB'])
print(df)
>> colA colB
0 1 2
1 3 0
2 2 3
最終效果如何:
print(df)
>> colA_0 colA_1 colA_2 colA_3 colB_0 colB_1 colB_2 colB_3
0 1 1 0 0 1 1 1 0
1 1 1 1 1 1 0 0 0
2 1 1 1 0 1 1 1 1
這適用於小型dataFrames:
def rankHotEncode(row):
newFeatures = {}
for i, v in row.iteritems():
for k in range(MULTIPLYFEATURES):
newFeatures[i + repr(k)] = 1 if v >= k else 0
return pd.Series(newFeatures)
df.apply(rankHotEncode, axis=1)
對於約100.000行的訂單,該解決方案不應經過硬編碼和有效處理。 我如何才能改善所提供的解決方案以使其更加高效,或者最好的方法是什么?
您可以將scikit-learn oneHotEncoder
與numpy.cumsum
oneHotEncoder
使用。 盡管它涉及一些副本,但它非常有效,因為它不會逐行處理矩陣。 這是使用它的示例代碼。
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
import numpy as np
df = pd.DataFrame([[1,2],[3,0],[2,3]], columns=['colA', 'colB'])
print(df)
n_values = df.max().values + 1
enc = OneHotEncoder(sparse=False, n_values=n_values, dtype=int)
enc.fit(df)
encoded_columns = [
'{}_{}'.format(col_name, i)
for col_name, n_value in zip(df.columns, n_values)
for i in range(n_value)
]
one_hot = enc.transform(df)
rank_hot = np.zeros_like(one_hot)
for col_start, col_end in zip(enc.feature_indices_[:-1], enc.feature_indices_[1:]):
one_hot_col_reversed = one_hot[:, col_start: col_end][:, ::-1]
rank_hot[:, col_start: col_end] = np.cumsum(one_hot_col_reversed, axis=1)[:, ::-1]
encoded_df = pd.DataFrame(rank_hot, columns=encoded_columns)
它輸出為您的示例
print(encoded_df)
>> colA_0 colA_1 colA_2 colA_3 colB_0 colB_1 colB_2 colB_3
0 1 1 0 0 1 1 1 0
1 1 1 1 1 1 0 0 0
2 1 1 1 0 1 1 1 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.