为什么循环在onehot编码中不起作用

问题描述

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]

怎么了?

解决方法

如果要使用i中具有的变量for i in data.columns:,则不应使用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,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,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,})

#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,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