Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
秩热编码python3_Python_Pandas_Machine Learning - Fatal编程技术网

秩热编码python3

秩热编码python3,python,pandas,machine-learning,Python,Pandas,Machine Learning,我想用秩热编码而不是一个热编码来处理熊猫数据帧 例如,以以下数据帧为例: 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 co

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

例如,以以下数据帧为例:

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

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

到目前为止你试过什么?需求是好的,但这样做并不能真正构成一个有效的编程问题。还有,你为什么要用熊猫来做这件事?@MadPhysician这个问题得到了更新,没有一个有效的解决方案,到目前为止,熊猫是处理我的数据的最佳方式,因为它内置了函数。谢谢。投票结束。