【发布时间】:2021-04-16 15:46:16
【问题描述】:
如何对这个循环进行矢量化?或者可以吗?我只是没看到。
for c in cats:
df[c] = np.where(df['categories'].str.contains(c),1,0)
(在阅读下面的全文之前,预计您会很想用get_dummies(sep=';) 回答看似热门的编码问题。但这并不是我真正想要的我在问。我严格想要回答的是上面的问题 - 关于矢量化该循环。我包含 完整故事 仅用于上下文。)
全文:
d = {'categories': ['catA;catB;catC','catA;catB','catC','catB;catC']}
df = pd.DataFrame(d)
print(df)
categories
0 catA;catB;catC
1 catA;catB
2 catC
3 catB;catC
cats = ['catA','catB','catC']
for c in cats:
df[c] = np.where(df['categories'].str.contains(c),1,0)
print(df)
categories catA catB catC
0 catA;catB;catC 1 1 1
1 catA;catB 1 1 0
2 catC 0 0 1
3 catB;catC 0 1 1
(这是添加到此问题底部的无关文本,因此 SO 将允许提交我的问题 - 以满足问题中更多文本的要求。我当然同意该要求,但在这种情况下,我认为上面的文字和代码充分描述了这种情况。)
【问题讨论】:
-
df.join(df['categories'].str.get_dummies(";")[cats]) -
使用
np.where有什么意义?只需使用astype(int)转换来自contains的布尔值。您正在迭代字符串列表,执行str方法。这里没有什么可以“矢量化”的!