pandas DataFrame取值修改生成新数据框/数组 解决TypeError问题
报错根因
你当前使用的df1中存储的不是数值类型,是pymatgen的Composition对象,当执行==0的等值判断时,Composition类内置的相等校验逻辑会尝试对比自身长度和对比对象的长度,而作为对比项的整数0没有len()属性,因此抛出该类型错误。
解决步骤
第一步:将数据框内容转换为数值类型
首先需要从Composition对象中提取你需要的数值(比如元素占比、总原子量等,根据你的实际业务需求调整提取逻辑),把全表所有元素转换为可直接比较的浮点/整数类型:
import pandas as pd import numpy as np # 示例:从Composition对象提取数值,lambda逻辑根据你实际需要的属性调整 df1 = df1.applymap(lambda comp: float(comp) if isinstance(comp, (int, float)) else comp.get_integer_formula_and_factor()[1])
第二步:向量化实现零值替换逻辑
你原来的嵌套循环+np.append写法效率极低,且数组初始化错误会导致索引越界、数组维度混乱,建议用掩码方式批量处理每一行的零值:
# 可自行调整设定的低值 low_threshold = 0.01 # 先转numpy数组操作更方便 arr = df1.values for row_idx in range(arr.shape[0]): current_row = arr[row_idx] # 取当前行非零值的最小值 non_zero_vals = current_row[current_row != 0] if len(non_zero_vals) == 0: # 可自行处理全零行的特殊逻辑 continue row_min_non_zero = non_zero_vals.min() # 匹配零值位置批量生成随机数替换 zero_pos_mask = current_row == 0 arr[row_idx, zero_pos_mask] = np.random.uniform( low=low_threshold, high=row_min_non_zero, size=zero_pos_mask.sum() ) # 处理完成后转成数据框即可 df2 = pd.DataFrame(arr, columns=df1.columns)
原有代码的其他问题
- 初始化
arr = np.array([[]])是空二维数组,直接按索引arr[j][i]赋值会触发索引越界 np.append的用法错误,你写的拼接逻辑会把数组逐步拉平为一维结构,完全丢失原有的行列对应关系- 双层循环逐元素操作的时间复杂度太高,数据量超过千行时性能差距会非常明显
内容的提问来源于stack exchange,提问作者James Arten
相关产品推荐
相关产品推荐

