为什么循环不能在一种热编码中工作

why doesn't the looping works in onehot encoding

for i in data.columns:
    top_10 = [x for x in data.i.value_counts().sort_values(ascending=False).head(10).index]
    for label in top_10:
        data[label] = np.where(data['i'] == label, 1, 0)
    data[['i'] + top_10]

哪里出错了?

如果你想使用你在 for i in data.columns: 中的变量 i 那么你不应该使用 data.i 而应该使用 data[i] (没有 ' '

for i in data.columns:

    top_10 = data[i].value_counts().sort_values(ascending=False).head(10).index

如果您使用更好的名称,也许它会更具可读性。 column_name

for column_name in data.columns:
    
    top_10 = data[column_name].value_counts().sort_values(ascending=False).head(10).index

data.idata["i"] 类似,它表示名称为 i 的列,而不是变量 i.


我不知道你想用嵌套的 for 循环做什么,但你也应该使用 data[i] 而不是 data["i"]

    for label in top_10:
        data[label] = np.where(data[i]==label, 1, 0)

但也许你应该使用更好的方法来创建标签

    for number, value in enumerate(top_10):
        data[i + '_' + str(number)] = np.where(data[i].index==value, 1, 0)

使用不同的名称可能更具可读性

for column_name in data.columns:
    
    top_10 = data[column_name].value_counts().sort_values(ascending=False).head(10).index

    for number, value in enumerate(top_10):
        data[column_name + '_' + str(number)] = np.where(data[column_name].index==value, 1, 0)

但是没有一些示例数据很难说它是否正确。


编辑:

最简单的工作示例。

我使用 random.seed(0) 总是得到相同的值。

我使用 top_3 在屏幕上查看所有值。

import pandas as pd
import random
import numpy as np

random.seed(0) #  to get the same values every time

data = pd.DataFrame({
    "A": [random.randint(0, 10) for _ in range(10)],
    "B": [random.randint(0, 10) for _ in range(10)],
})

#print(data)

for column_name in data.columns:
    #print(data[column_name].value_counts())
    top_3 = data[column_name].value_counts().sort_values(ascending=False).head(3).index
    #print(top_3)
    for number, value in enumerate(top_3, 1):
        name = column_name + '_' + str(number)
        data[name] = np.where(data[column_name]==value, 1, 0)
        
print(data)   

结果:

   A  B  A_1  A_2  A_3  B_1  B_2  B_3
0  6  9    1    0    0    0    0    0
1  6  3    1    0    0    0    0    0
2  0  8    0    0    0    0    0    1
3  4  2    0    1    0    1    0    0
4  8  4    0    0    0    0    1    0
5  7  2    0    0    1    1    0    0
6  6  1    1    0    0    0    0    0
7  4  9    0    1    0    0    0    0
8  7  4    0    0    1    0    1    0
9  5  8    0    0    0    0    0    1