【发布时间】:2018-12-24 18:33:18
【问题描述】:
显示了示例数据框的一列:
Fruit FruitA FruitB
Apple Banana Mango
Banana Apple Apple
Mango Apple Banana
Banana Mango Banana
Mango Banana Apple
Apple Mango Mango
我想在数据帧Fruit-Apple、Fruit-Mango、Fruit-Banana 中引入新列,并在它们分别存在的行中使用 one-hot 编码。因此,所需的输出是:
Fruit FruitA FruitB Fruit-Apple Fruit-Banana Fruit-Mango
Apple Banana Mango 1 1 1
Banana Apple Apple 1 1 0
Mango Apple Banana 1 1 1
Banana Mango Banana 0 1 1
Mango Banana Apple 1 1 1
Apple Mango Mango 1 0 1
我的代码是:
for i in range(len(data)):
if (data['Fruits'][i] == 'Apple' or data['FruitsA'][i] == 'Apple' or data['FruitsB'][i] == 'Apple'):
data['Fruits-Apple'][i]=1
data['Fruits-Banana'][i]=0
data['Fruits-Mango'][i]=0
elif (data['Fruits'][i] == 'Banana' or data['FruitsA'][i] == 'Banana' or data['FruitsB'][i] == 'Banana'):
data['Fruits-Apple'][i]=0
data['Fruits-Banana'][i]=1
data['Fruits-Mango'][i]=0
elif (data['Fruits'][i] == 'Mango' or data['FruitsA'][i] == 'Mango' or data['FruitsB'][i] == 'Mango'):
data['Fruits-Apple'][i]=0
data['Fruits-Banana'][i]=0
data['Fruits-Mango'][i]=1
但我注意到,如果有很多类型的“水果”,运行此代码所需的时间会显着增加。在我的实际数据中,只有 1074 行,而我尝试使用 one-hot 编码“标准化”的列有 18 个不同的值。因此,for 循环中有 18 个if 条件,并且代码现在还没有运行 15 分钟。这太荒谬了(很高兴知道它为什么要花这么长时间 - 在另一列中只包含 6 种不同类型的值,代码执行的时间要少得多,大约 3 分钟)。
那么,实现此输出的最佳(矢量化)方式是什么?
【问题讨论】:
标签: python pandas normalization one-hot-encoding