如何在Python中基于文本列含指定列表至少两词创建哑变量?
问题描述
需要为DataFrame创建一个哑变量innovation,满足以下条件:当lemmatised列中至少包含自定义列表innovation_words里的两个单词时,innovation设为1,否则设为0。
自定义单词列表:
innovation_words = ['community', 'local', 'charity', 'event', 'partner', 'volunteering', 'plastic', 'surplusfood']
lemmatised列每行是多个单词的集合(如列表形式)。
尝试过的无效代码:
conditions = [df_posts['lemmatised'].isin(innovation_words), df_posts['lemmatised'].isin(innovation_words)] dummy = [1,0] df_posts['innovation'] = np.select(conditions, dummy)
解决方案
原代码的问题在于isin()只能判断元素是否属于列表中的单个值,无法统计匹配单词的数量。可以按以下步骤实现需求:
步骤1:统一lemmatised列格式
如果列内容是空格分隔的字符串,先转换为单词列表:
# 若列是字符串格式,分割为单词列表 df_posts['lemmatised'] = df_posts['lemmatised'].str.split()
步骤2:统计每行匹配的单词数量
将自定义列表转为集合提升匹配效率,再用apply()结合集合交集统计匹配数:
innovation_set = set(innovation_words) # 计算每行与目标列表的匹配单词数量 df_posts['match_count'] = df_posts['lemmatised'].apply( lambda x: len(set(x) & innovation_set) )
步骤3:生成目标哑变量
根据匹配数量是否≥2赋值:
import numpy as np df_posts['innovation'] = np.where(df_posts['match_count'] >= 2, 1, 0) # 可选:删除中间统计列 # df_posts.drop('match_count', axis=1, inplace=True)
完整示例代码
import pandas as pd import numpy as np # 构造示例数据 data = { 'lemmatised': [ ['local', 'plastic', 'shop'], ['community'], ['charity', 'event', 'volunteering'], ['surplusfood', 'partner'] ] } df_posts = pd.DataFrame(data) innovation_words = ['community', 'local', 'charity', 'event', 'partner', 'volunteering', 'plastic', 'surplusfood'] innovation_set = set(innovation_words) # 统计匹配数 df_posts['match_count'] = df_posts['lemmatised'].apply(lambda x: len(set(x) & innovation_set)) # 生成哑变量 df_posts['innovation'] = np.where(df_posts['match_count'] >= 2, 1, 0) print(df_posts)
运行输出:
lemmatised match_count innovation 0 [local, plastic, shop] 2 1 1 [community] 1 0 2 [charity, event, volunteering] 3 1 3 [surplusfood, partner] 2 1
内容的提问来源于stack exchange,提问作者Hans.nl
相关产品推荐
相关产品推荐

