【发布时间】:2017-11-23 06:23:03
【问题描述】:
问题
传入数据是 0+ 个类别的列表:
#input data frame
df = pd.DataFrame({'categories':(list('ABC'), list('BC'), list('A'))})
categories
0 [A, B, C]
1 [B, C]
2 [A]
我想将其转换为每个类别一列和每个单元格中的 0/1 的 DataFrame:
#desired output
A B C
0 1 1 1
1 0 1 1
2 1 0 0
尝试
带有 LabelEncoder 的 OneHotEncoder 会卡住,因为它们不处理单元格中的列表。目前使用嵌套的for 循环实现了预期的结果:
#get unique categories ['A','B','C']
categories = np.unique(np.concatenate(x['categories']))
#make empty data frame
binary_df = pd.DataFrame(columns=[c for c in categories],
index=x.index)
print(binary_df)
A B C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
#fill data frame
for i in binary_df.index:
for c in categories:
binary_df.loc[i][c] = 1 if c in np.concatenate(x.loc[i]) else 0
我担心的是循环表明这是一种处理大型数据集(数十个类别、十万或更多行)的极其低效的方法。
有没有办法通过内置的 Numpy/Scikit 函数实现结果?
【问题讨论】:
-
避免在 cmets 中回答问题。
标签: python numpy encoding scikit-learn