求助:从多值单元格计算排除年份的价格均值的通用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
相关产品推荐
相关产品推荐

