Pandas:NULL的含义及使用时的注意事项

前一段时间在用Pandas处理数据的时候,遇到空值Null的时候出了一些匪夷所思的结果。后来发现是因为Pandas版本太低导致的。这篇博文只是想把遇到的一些问题整理出来,但是会使用Pandas最新版本(Pandas V1.1.5)

1. pandas中的NULL值及其判断

1) 首先Pandas中提供了专门的函数对空值进行判断,具体有isnull()、notnull()。 对于isnull()函数,如果元素为空值,而返回True。notnull()函数反之。如图1

图1

从图1中的结果可以看出,Pands会把np.nan、None以及数据缺失认为为NULL。这里要说明一下,无论是Pandas包里的运算,还是Python中的其他语句,都不能使用==进行空值判断。比如,针对图1中的a变量进行如图2中的运算,从结果上看,其运算结果均为False,所以==识别不出空值。pandas中有一个函数isin(),也不建议大家用这个函数来判断数据中是否包含空值? 可以参看博文https://blog.csdn.net/yeshang_lady/article/details/112207877

图2

在Python中,判断一个变量是否为空,需要用到is。具体如图3

图3

2)虽然np.nan和None都是空值,但是这两个变量类型不同。np.nan为float类型,而None为NoneType。下面我们将a变量中的各个元素的类型输出出来(图3)

图4

DataFrame或Series中含有空值,进行运算时如果稍不注意会导致错误,下面简单看个小例子(图5)

图5 

但这里要说明一点,如果DataFrame中的某一列或Series中的数据为数值类型,那么None会被转化成np.nan,若为Object类型,则None和np.nan保持各自类型。如图6

图6

2 涉及空值的计算

1) 对于Object类型的数据,尽可能使用Pandas给String提供的accessor。比如求字符串长度可以用图7解决。

图7

如果有定制化需求需要自定义函数时,需要在自定义函数体中处理空值。图7中的代码可以用如下自定义代码实现。

图8

2) 对于数值型数据,空值和任何数据进行数值运算结果仍为空值,一般不需要特殊处理。但如果要把数值型数据强制转化为字符串时,空值会被转化成“nan”(图9),这个要不要特殊处理,自行决定

图9

 

<think>好的,我现在需要回答用户关于如何使用pandas库删除NaN值的问题。用户可能对pandas不太熟悉,所以需要详细但清晰的步骤。 首先,根据用户提供的引用内容,有几个关键点:dropna方法、参数如how、axis、subset等。引用[1]和[3]提到了dropna的基本用法,包括axis和how参数。引用[4]给出了axis的具体例子,而引用[2]则解释了NaN在pandas中的本质,需要注意判断方法。 我应该先介绍dropna的基本使用,然后分参数讲解,比如axis控制行列,how决定删除条件,thresh设置非NaN值的最小数量,subset指定列。每个参数都需要例子,这样用户更容易理解。可能还需要提到inplace参数是否替换原数据,以及配合notnull()的方法,如引用[3]提到的。 接下来,用户可能需要知道如何处理特定列的空值,这候subset参数就很重要了,像引用[3]中的subset可以限制检查的列。此外,还要提醒常见的误区,比如直接用== np.nan判断是不可靠的,应该用isna()或notnull(),如引用[2]所述。 最后,生成相关问题,要考虑用户可能进一步想知道的内容,比如性能分析、不同方法的区别、替代方案等。例如,删除NaN的替代方法是填充,或者如何检测数据中的空值比例。 需要确保回答结构清晰,分步骤说明,并附上代码示例。同,引用正确的来源,比如引用[1]到[4]中的内容,确保信息的准确性。</think>### 使用Pandas删除NaN空值的详细方法 以下是使用Pandas删除NaN空值的具体步骤和示例: --- #### 1. **基本方法:`dropna()`** 通过`df.dropna()`可以直接删除包含NaN值的行或列。 - **参数`axis`**:控制删除方向 - `axis=0`(默认):删除包含NaN的行 - `axis=1`:删除包含NaN的列 - **参数`how`**:定义删除条件 - `how='any'`(默认):行/列中有任意NaN则删除 - `how='all'`:行/列中全部为NaN才删除 **示例代码**: ```python import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, 2, np.nan, 4], 'B': [np.nan, 2, 3, 4], 'C': [np.nan, np.nan, np.nan, np.nan] }) # 删除包含NaN的行(默认axis=0, how='any') df_cleaned = df.dropna() print("删除NaN行后的数据:\n", df_cleaned) # 删除包含NaN的列 df_cleaned_col = df.dropna(axis=1) print("删除NaN列后的数据:\n", df_cleaned_col) ``` --- #### 2. **高级参数:`thresh`和`subset`** - **`thresh`**:设置保留行/列所需的最少非NaN值数量 - 例如:`thresh=2`表示保留至少有2个非NaN值的行/列 - **`subset`**:指定检查NaN的列(仅对行操作有效) **示例代码**: ```python # 保留至少有2个非NaN值的行 df_thresh = df.dropna(thresh=2) print("保留至少2个非NaN的行:\n", df_thresh) # 仅在列A和B中检查NaN,删除符合条件的行 df_subset = df.dropna(subset=['A', 'B']) print("仅在A、B列检查NaN后的数据:\n", df_subset) ``` --- #### 3. **直接过滤:`notnull()`** 通过布尔索引筛选非空值,适用于复杂条件操作。 ```python # 保留列A不为空的行 df_filtered = df[df['A'].notnull()] print("列A非空的数据:\n", df_filtered) ``` --- #### 4. **注意事项** - **避免`inplace=True`陷阱**:建议赋值新变量(如`df = df.dropna()`)而非直接修改原数据[^3] - **NaN的本质**:Pandas中的NaN是`numpy.float64`类型,不可用`== np.nan`直接判断,需用`isna()`或`notnull()`[^2] --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值