如何重新分类Pandas DataFrame列?

4

我有一个 Pandas 数据框,看起来像这样:

> print(df)

           image_name                       tags
0                img1       class1 class2 class3
1                img2                     class2
2                img3              class2 class3
3                img4                     class1

如何重新分类tags列,使任何带有class3值的行都得到字符串"yes"的分配,而其他所有内容都得到字符串"no"的分配?

我知道可以使用以下方法检查搜索词的实例:

df['tags'].str.contains('class3')

然而,我不确定如何将其集成到手头的任务中。

以下是预期的输出:

           image_name                       tags
0                img1                        yes
1                img2                         no
2                img3                        yes
3                img4                         no
3个回答

5

使用 np.where 方法:

df['tags'] = np.where(df['tags'].str.contains('class3'),'yes','no')

或者

df['tags'] = 'no'
df.loc[df['tags'].str.contains('class3'),'tags'] = 'yes'

或者

df['tags'] = ['yes' if 'class3' in s else 'no' for s in df3.tags.values]

上述方法的输出结果为:
print(df)
  image_name tags
0       img1  yes
1       img2   no
2       img3  yes
3       img4   no

3
您还可以执行以下操作:
df['tags'] = df.tags.str.contains('class3').map({True:'Yes',False:'No'})
>>> df
  image_name tags
0       img1  Yes
1       img2   No
2       img3  Yes
3       img4   No

2
也许这比 str.contains 快一点。
v=np.array(['Yes','No'])[np.array(['class3' in x for x in df.tags]).astype(int)]
v
Out[267]: array(['No', 'Yes', 'No', 'Yes'], dtype='<U3')
#df['tags']=v

下面是时间列表:
#df=pd.concat([df]*1000)
#sacul
%timeit df.tags.str.contains('class3').map({True:'Yes',False:'No'})
The slowest run took 10.12 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 3.11 ms per loop
#Mine
%timeit np.array(['Yes','No'])[np.array(['class3' in x for x in df.tags]).astype(int)]
1000 loops, best of 3: 390 µs per loop
#Borealis
%timeit np.where(df['tags'].str.contains('class3'),'yes','no')
100 loops, best of 3: 2.46 ms per loop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接