【问题标题】:How to label encode while iter through the list of list in python如何在遍历python中的列表时标记编码
【发布时间】:2019-12-16 06:57:41
【问题描述】:

这就是我所做的,但它不会改变列表(数据集)列表中的内容,尽管能够打印出带有数字编码的标签。

dataset = [[32.3,33.5,34.2,35.3,35.3,35.7,"Light1on"],
         [52.3,52.5,53.2,54.8,55.3,55.3,"Light2on"],
         [100.3,110.2,112.3,132.5,142.3,153.5,"Fan1on"],
         [153.5,142.3,132.5,112.3,110.2,0,"Fan1off"],
         [33.2,34.5,34.6,35.3,35.3,35.8,"Light1on"],
         [33.2,35.2,35.4,36.0,36.2,42.3,"Light3on"]]

plabel = []
#dataset.to_csv('table.csv', index = None, header=True)
for row in dataset:
    print(row[6],'3')
    label = row[6]
    plabel.append(label)
    le = preprocessing.LabelEncoder()
    le.fit(plabel)
    label = le.transform(plabel)
    print(label)

    for column in row:
        print(column)

我希望它能够进行标签编码,以便我可以将其用于我的 K 最近邻模型。

结果:

dataset = [[32.3,33.5,34.2,35.3,35.3,35.7,"Light1on"],
         [52.3,52.5,53.2,54.8,55.3,55.3,"Light2on"],
         [100.3,110.2,112.3,132.5,142.3,153.5,"Fan1on"],
         [153.5,142.3,132.5,112.3,110.2,0,"Fan1off"],
         [33.2,34.5,34.6,35.3,35.3,35.8,"Light1on"],
         [33.2,35.2,35.4,36.0,36.2,42.3,"Light3on"]]

期望的结果:

dataset = [[32.3,33.5,34.2,35.3,35.3,35.7,0],
         [52.3,52.5,53.2,54.8,55.3,55.3,1],
         [100.3,110.2,112.3,132.5,142.3,153.5,2],
         [153.5,142.3,132.5,112.3,110.2,0,3],
         [33.2,34.5,34.6,35.3,35.3,35.8,0],
         [33.2,35.2,35.4,36.0,36.2,42.3,4]]

【问题讨论】:

  • 目前还不清楚到底是什么问题以及您期望发生什么。
  • @Grismar 问题是它没有将原始列表中的标签更改为标签编码的标签
  • 那么,您希望您的代码以某种方式更新dataset?请提供一个完整的示例来实际展示您遇到的问题并描述您期望的结果(与您得到的结果相比)。
  • @Grismar 我希望标签编码器更新列表,但是标签编码后它不会更新

标签: python dataframe machine-learning


【解决方案1】:

你可以使用列表推导

# get all sixth elements
plabel = [x[6] for x in dataset]
le.fit(plabel)
plabel = le.transform(plabel)
# replace sixth elements from each list inside 'dataset' with encoded label
dataset_encoded = [[plabel[i] if indx==6 else elem for indx, elem in enumerate(x)] for i,x in enumerate(dataset)]
>>> dataset_encoded

[[32.3, 33.5, 34.2, 35.3, 35.3, 35.7, 2],
 [52.3, 52.5, 53.2, 54.8, 55.3, 55.3, 3],
 [100.3, 110.2, 112.3, 132.5, 142.3, 153.5, 1],
 [153.5, 142.3, 132.5, 112.3, 110.2, 0, 0],
 [33.2, 34.5, 34.6, 35.3, 35.3, 35.8, 2],
 [33.2, 35.2, 35.4, 36.0, 36.2, 42.3, 4]]

【讨论】:

    【解决方案2】:

    一个简单的解决方案是:

    1. 将此数据转换为数据框。
    2. 标签编码此数据帧的最后一列
    3. 将此数据帧转换回列表列表。

    给你:

    df = pd.DataFrame.from_records(dataset)
    df[6] = le.fit_transform(df[6].values)
    dataset = df.values.tolist()
    

    如果有什么需要解释的请评论。

    【讨论】:

      【解决方案3】:

      您的问题不清楚,但如果您只想在迭代 dataset 时替换第 7 列的内容,请尝试以下操作:

      dataset = [[32.3,33.5,34.2,35.3,35.3,35.7,"Light1on"],
               [52.3,52.5,53.2,54.8,55.3,55.3,"Light2on"],
               [100.3,110.2,112.3,132.5,142.3,153.5,"Fan1on"],
               [153.5,142.3,132.5,112.3,110.2,0,"Fan1off"],
               [33.2,34.5,34.6,35.3,35.3,35.8,"Light1on"],
               [33.2,35.2,35.4,36.0,36.2,42.3,"Light3on"]]
      
      plabel = []
      #dataset.to_csv('table.csv', index = None, header=True)
      for i, row in enumerate(dataset.copy()):
          print(row[6],'3')
          label = row[6]
          plabel.append(label)
          le = preprocessing.LabelEncoder()
          le.fit(plabel)
          label = le.transform(plabel)
          print(label)
          row[6] = label
          dataset[i] = row
      
          for column in row:
              print(column)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        • 2018-06-11
        • 2021-04-01
        • 2016-07-16
        相关资源
        最近更新 更多