pandas dataframe野外粒径数据处理:混合类型转换与离散分类问题
混合类型粒径数据处理解决方案
报错核心原因
- 误用Python内置关键字
dict作为变量名,会引发不可预期的类型错误 - 手动嵌套循环判断
type(item)==str无法兼容pandas/numpy的数值类型(如np.int64/np.float64) - 逐列处理时重复执行全表
replace操作,导致列类型频繁变化触发异常
优化实现代码
首先需要提前定义好离散分类的分箱参数,示例用Wentworth粒度分级的分箱供参考,可根据实际需求调整:
import pandas as pd import numpy as np # 提前定义粒径分箱参数 size_class = [0, 0.01, 0.5, 2, 4, 8, 16, 32, 64, 128, 256, 512, np.inf] label = [0.01, 0.5, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] # 读取Excel,避免用内置关键字做变量名 sheet_dict = pd.read_excel('/media/path', sheet_name=None) # 遍历所有工作表 for sheet_name, df in sheet_dict.items(): # ---------------- 需求1:计算不可测量项占比 ---------------- # 全表转字符串后统计所有值的出现频率,完全规避混合类型判断问题 all_values = df.applymap(str).stack() total_count = len(all_values) B_ratio = (all_values == 'B').sum() / total_count D_ratio = (all_values == 'D').sum() / total_count # 可根据需求打印或存储占比结果 print(f"工作表{sheet_name}的基岩(B)占比:{B_ratio:.2%},碎屑(D)占比:{D_ratio:.2%}") # ---------------- 需求2:替换指定标识为数值 ---------------- replace_map = { 'S': 0.5, 'L': 0.01, 'C': 0.01, # 不可测量项转NaN避免影响后续数值计算 'B': np.nan, 'D': np.nan } df = df.replace(replace_map) # ---------------- 需求3:大粒径离散分类 ---------------- for col in df.columns: # 转数值,非数值自动转NaN df[col] = pd.to_numeric(df[col], errors='coerce') # 离散分箱,right=True表示右闭区间,220会自动落入128-256区间对应标签256 df[col] = pd.cut(df[col], bins=size_class, labels=label, right=True) # 处理后的df存回原字典,可后续导出 sheet_dict[sheet_name] = df # 示例:将所有处理后的表导出为新Excel with pd.ExcelWriter('/media/processed_result.xlsx') as writer: for sheet_name, df in sheet_dict.items(): df.to_excel(writer, sheet_name=sheet_name, index=False)
关键优化点
- 用
applymap(str)统一将全表转为字符串做统计,彻底解决混合类型判断报错问题 - 全表一次性执行替换操作,不需要逐列处理,性能和稳定性更高
- 所有非数值类的不可测量项统一转NaN,不会影响后续数值计算和分箱操作
- 分箱逻辑自动匹配区间归并规则,符合你要求的220归入256分类档的需求
内容的提问来源于stack exchange,提问作者Mac McMahan
相关产品推荐
相关产品推荐

