Pandas:如果某个字符串存在于多个列中的任何一列中,我想求和一个计数,并将此计数添加到另一个具有搜索项的数据帧中

2024-06-02 09:08:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个视频数据框,其中有几列标签(字符串),如下所示:

import pandas as pd
videos = [(1, 'cool video','drama','horror'), (2, 'great video','sports','drama'), (3,'super video','comedy','horror')]
df = pd.DataFrame(data=videos, columns=['video_id', 'title','tag_1','tag_2'])

    video_id    title       tag_1   tag_2
0   1           cool video  drama   horror
1   2           great video sports  drama
2   3           super video comedy  horror

然后我有另一个搜索词数据框“df_search_terms”(例如,我可以将其放入列表中)。我想看看这些搜索词是否在其中一列中至少出现一次,如果出现,则在搜索词的数据帧中增加一个计数器(也就是说,好的,我们为视频找到了一次这个词,所以+=1)。为了澄清,我想知道在包含+/-1000个视频的数据框中,至少有一个标签的搜索词匹配了多少次

显然,我可以对匹配项进行计数,但我只想为特定项在df_search_项中增加一次计数器。类似这样的东西(这不起作用,但我希望你能理解要点):

search_count=df['tag_1'].str.contains('drama').sum()
df_search_terms.loc[(df_search_terms['search_term'] == 'drama'),'matching_videos'] +=1

df_搜索_术语如下:

search_terms = [('drama',0), ('horror',0), ('sports',0)]

df_search_terms = pd.DataFrame(data=search_terms, columns=['search_term', 'number_matching_videos'])

search_term     number_matching_videos
drama                            0
horror                           0
sports                           0

我想解决办法在于巧妙地使用apply,但恐怕我想不出来

我尝试使用下面这样的“if”语句,但我有一个错误:

if df.loc[(df['name'] == 'drama') | (df['tag_1'] == 'drama') | (df['tag_2'] == 'drama')]:
  df_search_terms.loc[(df_search_terms['search_term'] == 'drama'),'matching_videos'] +=1

ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()


Tags: 数据dfsearch视频tagvideolocvideos
2条回答

试试这个:

(df_search_terms['number_matching_videos'] = 
 df_search_terms['search_term'].map(df.set_index('video_id')
                                    .stack()
                                    .str.get_dummies()
                                    .sum()))

还有一种方法:

df_search_terms['number_matching_videos'] = (df_search_terms['search_term']
                                             .map((df.loc[:,df.columns.str.contains('tag')]
                                                   .stack()
                                                   .str.extractall('({})'.format(df_search_terms['search_term'].str.cat(sep='|')))[0]
                                                   .str.get_dummies()
                                                   .sum())))

使用正则表达式搜索和计算所有匹配项

search_re = '(' + df_search_terms.search_term.str.cat(sep=')|(') + ')'

将所有标记列合并为单个字符串并进行搜索

df_search_terms['number_matching_videos'] = (
    df.filter(regex='tag_*')
    .agg(' '.join, axis=1)
    .str.extractall(search_re)
    .notnull().sum()
)

输出

  search_term  number_matching_videos
0       drama                       2
1      horror                       2
2      sports                       1

相关问题 更多 >