Python中定义Rower函数统计Pandas DataFrame含NaN行数的方法(新手向)
如何实现统计含NaN值行数的Rower函数?
嘿,作为Python纯新手,别担心,咱们一步步来搞清楚这个问题~你现在的代码是统计了DataFrame里所有NaN的总数,而我们需要的是至少包含一个NaN值的行数,这两者的区别还是挺大的,我来给你拆解清楚。
第一步:先搞懂函数的基本定义
对于Python函数来说,基本结构非常清晰:
def 函数名(参数): # 函数内部的逻辑代码 return 返回值
你之前定义的pandasNull其实已经符合这个基础结构啦,只是内部的统计逻辑需要调整。现在我们要把函数名改成你想要的Rower,参数依然是接收一个pandas DataFrame对象。
第二步:实现统计含NaN行数的核心逻辑
我们需要的是判断每一行里是否存在至少一个NaN,然后统计这样的行数。这里可以用pandas的几个方法组合完成:
df.isna():把DataFrame里的每个元素转换成布尔值,NaN的位置标记为True,非NaN标记为False.any(axis=1):按行(axis=1表示行方向)进行判断,只要这一行有一个True(也就是有一个NaN),就返回True;如果一行全是False(没有NaN),则返回False.sum():统计所有True的数量,也就是我们要的含NaN的行数
所以正确的Rower函数实现如下:
import pandas as pd import numpy as np # 因为你用到了np.random.randn生成数据,所以需要导入这个库 def Rower(df): # 判断每行是否存在NaN,再统计符合条件的行数 return df.isna().any(axis=1).sum()
第三步:结合你的示例代码测试函数
我们用你提供的示例DataFrame来测试这个函数,看看效果:
# 创建原始随机DataFrame df = pd.DataFrame( np.random.randn(6,4), index=[1,2,3,4,5,6], columns=['A','B','C','D'] ) # 将DataFrame中小于等于0的值替换为NaN(这就是你定义的example_df) example_df = df[df>0] # 调用Rower函数统计含NaN的行数 print(Rower(example_df))
核心逻辑逐行解释
df.isna():生成一个和原DataFrame形状完全一致的布尔型DataFrame,每个位置标记该元素是否为NaN。.any(axis=1):对每一行进行布尔判断,只要该行存在至少一个True(即存在NaN),就返回True;反之返回False。这一步会得到一个布尔型Series,索引和原DataFrame保持一致。.sum():在pandas中,布尔值True会被当作数值1,False当作0,所以sum()会直接计算出所有True的数量,也就是我们需要的包含NaN值的行数。
和你原有代码的区别
你原来的df.isna().sum().sum()是先按列统计每列的NaN数量(第一个sum()),然后把所有列的统计结果相加(第二个sum()),得到的是整个DataFrame中NaN的总个数,和我们要统计的「含NaN的行数」完全不是一回事哦~
内容的提问来源于stack exchange,提问作者Emma__BB
相关产品推荐
相关产品推荐

