Python 如果索引包含任何字符串值,请应用标签,否则应用不同的标签

Python 如果索引包含任何字符串值,请应用标签,否则应用不同的标签,python,numpy,pandas,dataframe,Python,Numpy,Pandas,Dataframe,我有一个输出下表的数据框。请注意,“搜索词”是索引 Search term Impressions Clicks Cost Converted clicks american brewing 286446 104862 8034.18 6831 american brewing supplies 165235 64764 3916.48 4106 brewing supplies

我有一个输出下表的数据框。请注意,“搜索词”是索引

Search term                 Impressions Clicks  Cost     Converted clicks
american brewing            286446      104862  8034.18  6831
american brewing supplies   165235      64764   3916.48  4106
brewing supplies            123598      8131    6941.87  278
wine bottles                272969      7438    4944.7   194
www americanbrewing com     2782        1163    227.17   120
home brewing                216138      3744    3468.24  110
wine making                 147985      6602    5024.54  108
如果“搜索词”(索引)包含
'american brewing'
'americanbrewing'
,请将标签
'Brand'
,否则将
'Non-Brand'
应用于标题为
标签的列

Search term                 Impressions Clicks  Cost     Converted clicks    Label
american brewing            286446      104862  8034.18  6831                Brand
american brewing supplies   165235      64764   3916.48  4106                Brand
brewing supplies            123598      8131    6941.87  278                 Non-brand
wine bottles                272969      7438    4944.7   194                 Non-brand
www americanbrewing com     2782        1163    227.17   120                 Brand
home brewing                216138      3744    3468.24  110                 Non-brand
wine making                 147985      6602    5024.54  108                 Non-brand
我已经看到了许多关于StackOverflow的示例,如下所示:

df['Label'] = df[df['SomeColumn'].str.contains('american brewing|americanbrewing')]
但这不起作用,因为我的
'SomeColumn'
df.index
,当我尝试以下操作时:

df['Label'] = df[df.index.str.contains('american brewing|americanbrewing')]
我得到的错误是:AttributeError:“Index”对象没有属性“str”

我还看到了使用
np的例子。其中
看起来很有希望,但我仍然遇到同样的问题,因为
的“搜索词”
不是一列,而是
索引

df['Label'] = np.where(df['Search term'].str.contains('american brewing|americanbrewing', 'Brand', 'Non-brand')
以下是我的完整代码:

import pandas as pd
import numpy as np

brand_terms = ['american brewing', 'americanbrewing']

data = pd.read_csv(r'sqr.csv', encoding='cp1252')

df = pd.DataFrame(data)
df['Search term'] = df['Search term'].replace(r'[^\w&\' ]', '', regex=True)
df['Cost'] = df['Cost'].replace(r'[^\d\.]', '', regex=True).astype('float')
#print(df.dtypes)
grouped = df.groupby('Search term')
result = grouped[['Impressions', 'Clicks', 'Cost', 'Converted clicks']].sum()
result = result.sort(['Converted clicks','Cost'], ascending=False)

#This doesn't work
result['Label'] = result.where(result['Search term'].str.contains('|'.join(brand_terms), 'Brand', 'Non-brand'))

result.to_csv('sqr_aggregate.csv')

如何根据
搜索项
(索引)是否包含多个可能的字符串值,输出
结果
数据框
中的
标签
列?如果
True
,则应用
品牌
,否则,将
非品牌
应用到
标签
列。

尝试将代码更改为使用
df.groupby('Search term',as_index=False)
如果不想重置索引,这里有一种方法

您可以将
索引
转换为
系列
并应用转换

In [16]: np.where(pd.Series(df.index).str.contains('american brewing|americanbrewing'),
                  'Brand', 'Non-Brand')
Out[16]:
array(['Brand', 'Brand', 'Non-Brand', 'Non-Brand', 'Brand', 'Non-Brand',
       'Non-Brand'],
      dtype='|S9')

谢谢你的建议。我照你的建议做了。然后将这一行
result['Label']=np.where(result['Search term'].str.contains('124;'.join(brand_terms)),'brand','Non brand')
,然后将
result.to_csv('sqr_aggregate.csv',index=False)
(不输出索引)更改为现在就可以了。这更符合我的期望。我使用了
result['Label']=np.where(pd.Series(result.index).str.contains('|'.join(brand_术语)),'brand','Non brand')
,它可以按预期工作。我缺少的关键是将数据帧索引转换为一个系列。我不想那样做,也不知道我能那样做。谢谢你的建议。