如何在Pandas DataFrame中将np.zeros(2)替换为np.NaN
解决DataFrame中替换
np.zeros(2)数组为NaN的问题 问题根源
你之前用replace、eq等方法无效,是因为Pandas默认的元素比较针对标量或同结构数组的逐值匹配,但你的DataFrame里的元素是独立的numpy数组对象——即使两个数组内容全为0,它们的内存地址不同,直接用==比较会判断为不相等,所以无法匹配到目标数组。
解决方案:逐个元素检查内容
用applymap遍历DataFrame的每个元素,判断其是否为形状(2,)的全零numpy数组,满足条件则替换为np.nan:
import pandas as pd import numpy as np # 初始化你的DataFrame df = pd.DataFrame({'x' : [np.zeros(2), np.array([1,2])], 'y' : [np.array([3,2]),0], 'z' : [np.array([4,5]),np.zeros(2)], 't' : [np.array([3,4]),np.array([4,5])]}) # 定义替换逻辑函数 def replace_zero_arr(val): if isinstance(val, np.ndarray) and val.shape == (2,) and (val == 0).all(): return np.nan return val # 应用到整个DataFrame df = df.applymap(replace_zero_arr)
后续计算每行有效数组的均值
替换完成后,你可以通过apply遍历每行,筛选出非NaN、非标量0的数组,合并后计算均值:
def calculate_row_mean(row): # 筛选有效数组:排除NaN和标量0 valid_arrs = [arr for arr in row if not pd.isna(arr) and arr != 0] if not valid_arrs: return np.nan # 合并所有有效数组并计算均值 combined_arr = np.concatenate(valid_arrs) return combined_arr.mean() # 生成每行均值 row_averages = df.apply(calculate_row_mean, axis=1)
内容的提问来源于stack exchange,提问作者user1627466
相关产品推荐
相关产品推荐

