如何修改Pandas代码适配多类型Price列的数值提取与均值计算?
解决DataFrame多类型Price列的数值提取与均值计算问题
问题说明
需要处理DataFrame的Price列,该列数据类型混杂,涵盖带字符串的价格(如USD500-750)、纯数值、空值等场景,要求提取有效数值并计算均值,同时排除年份类数值(如2019这类四位小数值)。
现有代码的问题
原代码仅能处理带字符串包裹的数值,对空值、纯数值(包括带千分位逗号的数值)完全无效:
s=df['Price'].str.findall('\d+') df['Price'] = s.apply(lambda x: np.mean([float(i) for i in x if int(i)<2000]))
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ "Price": ["Above Market Price", "USD200K as an initial price", "USD310K to 360K.", 300000, "", "150,000"] })
修改后的代码方案
下面是适配所有数据类型的完整代码,能处理空值、纯数值、带单位/千分位的字符串,同时排除年份:
import pandas as pd import numpy as np import re def process_price(price): # 处理空值或空字符串 if pd.isna(price) or str(price).strip() == "": return "" # 统一转为字符串,先去掉千分位逗号 price_str = str(price).replace(",", "") # 先提取带K后缀的数字(忽略大小写),再提取纯数字 k_matches = re.findall(r'(\d+)K', price_str, re.IGNORECASE) matches = k_matches if k_matches else re.findall(r'\d+', price_str) valid_values = [] for num_str in matches: try: num = int(num_str) # 排除年份:四位数字且在1900-2100区间 if len(num_str) == 4 and 1900 <= num <= 2100: continue # 带K的直接取数字(已经是千单位),纯大数值转成千单位 if k_matches: valid_values.append(num) else: valid_values.append(num / 1000) except ValueError: continue # 计算均值,无有效数值则返回空字符串 if valid_values: mean_val = np.mean(valid_values) return int(mean_val) if mean_val.is_integer() else mean_val return "" # 应用函数生成Output列 df['Output'] = df['Price'].apply(process_price)
代码关键点
- 所有类型统一转字符串处理,避免类型判断混乱
- 优先匹配带
K的数值,直接提取数字作为千单位;纯数值自动除以1000对齐单位 - 严格排除年份:四位数字且在1900-2100区间的数值直接跳过
- 空值/空字符串直接返回空,和预期输出一致
- 异常捕获避免数值转换报错
运行结果
执行后得到的结果完全符合预期:
print(df[['Output']]) # 输出: Output 0 1 200 2 335 3 300 4 5 150
内容的提问来源于stack exchange,提问作者lala345
相关产品推荐
相关产品推荐

