【问题标题】:why doesn't the looping works in onehot encoding为什么循环不能在一种热编码中工作
【发布时间】:2020-12-11 18:52:57
【问题描述】:
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]

错在哪里?

【问题讨论】:

  • 您能详细说明一下吗?预期输出是什么,观察到的输出是什么?
  • 我的预期输出应该是“每个列的前 10 个唯一值应作为新列添加到数据集中”
  • 您实际看到的行为是什么?
  • x for x in data.i.value_counts() 在这部分我收到类似“AttributeError: 'DataFrame' object has no attribute 'i'的错误”
  • 您使用i 作为data 的属性(在data.i.value_counts() 中)这可能会导致问题

标签: python one-hot-encoding


【解决方案1】:

如果你想使用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-loop 做什么,但您也应该使用 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

【讨论】:

  • 我是初学者,非常感谢@furas,这是一个非常清楚的解释。再次感谢。
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2015-04-24
  • 1970-01-01
  • 2020-03-18
相关资源
最近更新 更多