gpt4 book ai didi

python - 排名热门编码 python3

转载 作者:行者123 更新时间:2023-11-30 09:47:37 24 4
gpt4 key购买 nike

我想使用排名热编码而不是单热编码来处理 pandas 数据帧。

例如,以这个 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

它最终应该是什么样子:

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

这适用于小型数据帧:

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 oneHotEncodernumpy.cumsum 。虽然它涉及一些副本,但它非常有效,因为它不逐行处理矩阵。这是使用它的示例代码。

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

关于python - 排名热门编码 python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50329109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com