You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从多值单元格计算排除年份的价格均值的通用Python方法

解决多Excel合并与动态数值均值计算问题

1. 合并多个同模板Excel文件

先将所有目标Excel文件合并为单个DataFrame:

import pandas as pd
import glob

# 匹配所有目标Excel文件(可根据实际路径修改通配符)
excel_paths = glob.glob("./your_folder/*.xlsx")
# 批量读取并合并数据
combined_df = pd.concat([pd.read_excel(path) for path in excel_paths], ignore_index=True)

2. 提取价格数值并计算通用平均值

针对Price列中任意数量的有效数值(排除年份),直接计算平均值,无需生成中间列:

def get_avg_price(text):
    # 提取文本中所有数字字符串
    num_str_list = pd.Series(text).str.findall(r'\d+')[0]
    # 过滤年份(这里按4位且≥2000的数字判断,可按需调整)
    valid_nums = []
    for num_str in num_str_list:
        num = int(num_str)
        # 排除年份类数字,保留价格数值
        if not (len(num_str) == 4 and num >= 2000):
            valid_nums.append(float(num))
    # 计算平均值,无有效数值时返回NaN避免报错
    return sum(valid_nums) / len(valid_nums) if valid_nums else pd.NA

# 应用到合并后的DataFrame
combined_df['Avg_Price'] = combined_df['Price'].apply(get_avg_price)

简化版写法(一行lambda)

如果偏好简洁代码,也可以用lambda表达式直接处理:

combined_df['Avg_Price'] = combined_df['Price'].str.findall(r'\d+').apply(
    lambda x: sum(float(n) for n in x if not (len(n)==4 and int(n)>=2000)) / len([n for n in x if not (len(n)==4 and int(n)>=2000)]) 
    if [n for n in x if not (len(n)==4 and int(n)>=2000)] else pd.NA
)

关键说明

  • 年份过滤逻辑:默认排除4位且≥2000的数字(如2019),若你的年份范围不同,可自行调整判断条件(比如改为1900<=int(n)<=2100)
  • 适配任意数量数值:不管单元格内有1个还是5个有效价格,都会自动计算所有数值的平均值
  • 空值处理:当单元格无有效价格时,返回pd.NA,避免出现除以0的报错

内容的提问来源于stack exchange,提问作者lala345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:32:51