Pandas导入Excel列存在多数据类型的处理求助
处理混合类型列的分步解决方案
1. 清理空白单元格(空格字符串转NaN)
先处理列中仅含空格的单元格,避免后续类型转换出错:
import numpy as np # 处理目标列(以C15为例,C17可同理操作) dfc8['C15'] = dfc8['C15'].apply(lambda x: x.strip() if isinstance(x, str) else x) dfc8['C15'] = dfc8['C15'].replace('', np.nan) # 对C17执行同样清理 dfc8['C17'] = dfc8['C17'].apply(lambda x: x.strip() if isinstance(x, str) else x) dfc8['C17'] = dfc8['C17'].replace('', np.nan)
通过isinstance(x, str)判断类型,避免对数值调用strip()引发报错,同时把清理后为空的字符串转为NaN。
2. 统一转换为数值类型
用pd.to_numeric强制将列转为单一数值类型,无法转换的内容自动设为NaN:
dfc8['C15'] = pd.to_numeric(dfc8['C15'], errors='coerce') dfc8['C17'] = pd.to_numeric(dfc8['C17'], errors='coerce')
errors='coerce'参数会把所有非数值内容转为NaN,此时列会统一为float类型(包含NaN),满足后续数学运算的类型要求。
3. 执行数学运算(自动跳过非数值行)
修正你原代码的语法错误后直接运行即可——NaN参与运算结果仍为NaN,相当于自动跳过非数值行:
# 修正后的运算逻辑 dfc8['C17'] = ((dfc8['C17'] / 100).astype(int) * 12) + ((dfc8['C17'] / 100 - (dfc8['C17'] / 100).astype(int)) * 100)
如果需要保留原始非数值行的内容,可改用mask方法:
calc_result = ((dfc8['C17'] / 100).astype(int) * 12) + ((dfc8['C17'] / 100 - (dfc8['C17'] / 100).astype(int)) * 100) dfc8['C17'] = dfc8['C17'].mask(dfc8['C17'].notna(), calc_result)
额外优化:导入阶段提前处理
如果想从根源减少类型混乱,可在pd.read_excel中指定converters参数,提前处理目标列:
def clean_col(x): if isinstance(x, str): x = x.strip() return float(x) if x else np.nan return x # 14是C15对应的列索引(M:AA共15列,从0开始计数) df8 = [pd.read_excel(xls, sheet_name=s, skiprows=4, nrows=32, usecols='M:AA', header=None, converters={14: clean_col}) for s in bolt]
导入后列已为统一数值类型,后续无需重复转换。
内容的提问来源于stack exchange,提问作者Rand0mdude
相关产品推荐
相关产品推荐

