Python:统计匹配词产品数并求均价时结果为Series异常排查
问题分析与解决
你得到空Series的核心原因大概率是过滤后没有匹配到任何产品数据,导致mean()操作返回了空结果。下面我会拆解常见的错误场景,并给出正确的实现方式:
常见错误原因
- 误用精确匹配而非包含匹配:如果你的代码用了
df['Product'].isin(wordlist),这是检查产品名称是否完全等于词表中的某个单词,而非包含单词。比如词表里是"phone",但产品名是"smart phone",isin就会匹配失败,导致过滤后的数据为空。 - 大小写不匹配:词表中的单词是"Phone",但产品名里是"phone"或"PHONE",字符串匹配默认区分大小写,会直接导致匹配不到。
- 词表单词带特殊字符/空格:比如词表里的单词是" smart phone"(带前导空格),但产品名里是"smart phone",这种细微差异也会让匹配失效。
- Product列存在缺失值(NaN):如果Product列有NaN,执行包含检查时会返回NaN,布尔索引会自动排除这些行;如果所有行要么是NaN要么匹配不到,就会得到空DataFrame。
正确实现示例
假设你的DataFrame结构如下:
import pandas as pd df = pd.DataFrame({ 'Product': ['smart phone', 'wireless headphone', 'laptop', 'gaming phone'], 'Price': [599, 199, 999, 799] }) wordlist = ['phone', 'headphone']
步骤1:正确过滤包含词表单词的产品
使用str.contains结合正则表达式实现多单词包含匹配,同时处理大小写和缺失值问题:
# 构建正则表达式,匹配词表中的任意单词,忽略大小写 pattern = '|'.join(wordlist) filtered_df = df[df['Product'].str.contains(pattern, case=False, na=False)]
case=False:忽略大小写匹配,避免大小写差异导致的匹配失败na=False:将Product列的NaN值视为False,避免干扰过滤逻辑
步骤2:统计数量和平均价格
product_count = len(filtered_df) average_price = filtered_df['Price'].mean()
如果filtered_df不为空,average_price会返回一个标准float数值;如果确实没有匹配到数据,average_price会返回NaN(而非空Series),你可以根据业务需求用fillna(0)或其他方式处理这种情况。
空结果排查方法
如果还是得到空结果,先打印filtered_df确认是否有数据:
print(filtered_df)
若为空,再逐个验证:
- 打印
df['Product'].str.contains(pattern, case=False, na=False)的结果,查看哪些行是True - 检查词表中的单词是否确实存在于Product列的字符串中
- 确认Product列的数据类型是字符串(如果是其他类型,
str.contains会报错或返回全False)
内容的提问来源于stack exchange,提问作者harry04
相关产品推荐
相关产品推荐

