热秩3编码Python

2024-09-28 03:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用秩热编码而不是一个热编码来处理熊猫数据帧。在

例如这个pandas数据帧:

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

最终应该是什么样子:

^{pr2}$

这适用于小数据帧:

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行的数据不应高效。 如何改进所提供的解决方案以使其更有效,或者最好的方法是什么?在


Tags: 数据indataframepandas编码dffor解决方案
1条回答
网友
1楼 · 发布于 2024-09-28 03:24:11

您可以使用scikit learn^{}和{a2}。虽然它涉及到一些副本,但它是相当有效的,因为它不处理矩阵逐行。下面是一个使用它的示例代码。在

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)

它为您的示例输出

^{pr2}$

相关问题 更多 >

    热门问题