【问题标题】:How can I vectorize this loop? [duplicate]如何矢量化这个循环? [复制]
【发布时间】: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 方法。这里没有什么可以“矢量化”的!

标签: python pandas numpy


【解决方案1】:

试试get_dummies

df.categories.str.get_dummies(sep=';')
Out[113]: 
   catA  catB  catC
0     1     1     1
1     1     1     0
2     0     0     1
3     0     1     1
df = df.join(df.categories.str.get_dummies(sep=';'))

【讨论】:

  • 谢谢,但没有回答我关于矢量化循环的问题。
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2020-12-11
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多