如何在Pandas DataFrame列中存储列表并实现高兴趣关键词筛选
解决Pandas存储列表列的报错及关键词匹配需求实现
先解决"setting an array element with a sequence"报错
你之前直接用df['Column_Name'] = []或df['Column_Name'] = list()初始化列的方式有问题——Pandas默认会把列当成同类型的标量数组,空列表会被识别为长度为0的序列,和DataFrame的行数不匹配,后续追加内容时就会触发类型冲突报错。
正确的初始化空列表列的方式是:
import pandas as pd # 初始化每个元素都是空列表的列 df_main['Matched_Keywords'] = pd.Series([[] for _ in range(len(df_main))]) df_main['Keyword_Sources'] = "" # 字符串列直接初始化为空字符串即可
完整实现关键词匹配需求
下面是针对你的两个DataFrame,实现所需功能的完整代码:
1. 准备测试数据(可替换成你的真实数据)
# 主数据 df_main = pd.DataFrame({ 'Sentence': [ "我喜欢Python和数据分析", "Java开发效率高", "没匹配关键词的句子", "Python和Java都很流行" ] }) # 关键词数据 df_key = pd.DataFrame({ '关键词': ['Python', '数据分析', 'Java', 'C++'], 'Interest level': [5.0, 4.0, 5.0, 3.0], 'Source': ['编程', '数据领域', '编程', '后端'] })
2. 定义匹配处理函数
def match_keywords(sentence): # 筛选出句子中包含的关键词行 matched_rows = df_key[df_key['关键词'].apply(lambda x: x in sentence)] if len(matched_rows) == 0: return [], "" # 找到最高兴趣度 max_interest = matched_rows['Interest level'].max() # 筛选出兴趣度最高的所有关键词 top_matches = matched_rows[matched_rows['Interest level'] == max_interest] # 返回关键词列表和去重后的来源字符串(用逗号分隔) return top_matches['关键词'].tolist(), ', '.join(top_matches['Source'].unique())
3. 应用函数到主数据
# 对每个句子应用匹配函数,拆分结果到新列 df_main[['Matched_Keywords', 'Keyword_Sources']] = df_main['Sentence'].apply( lambda x: pd.Series(match_keywords(x)) )
最终效果
运行后df_main会新增两列:
Matched_Keywords:每行是符合条件的关键词列表(无匹配则为空列表,多个最高兴趣度关键词则全部保留)Keyword_Sources:对应关键词的来源字符串(去重后用逗号分隔)
注意事项
- 如果你的关键词匹配需要更精准(比如全词匹配、正则匹配),可以修改
match_keywords函数里的匹配逻辑,比如用re.search(r'\b' + re.escape(x) + r'\b', sentence)实现全词匹配 - 若数据量很大,循环或
apply效率较低,可以考虑用向量化操作优化匹配速度
内容的提问来源于stack exchange,提问作者Bing Shuen
相关产品推荐
相关产品推荐

