【Python】从列表/dataframe/pandas中删除 nan

本文介绍如何使用Pandas库从列表中移除NaN值的方法。提供了多种方式包括使用dropna()函数、numpy库的isnan()函数及纯Python的实现。这些方法适用于不同场景并保持数据的完整性。

0.问题描述

在尝试与Pandas一起做一个项目时,我遇到了一个问题。我有一个包含 avalue 的列表,但我无法删除nan

incoms=data['int_income'].unique().tolist()
incoms.remove('nan')

报错:
list.remove(x): x 不在列表中”

列表如下:incoms:

[75000.0, 50000.0, 0.0, 200000.0, 100000.0, 25000.0, nan, 10000.0, 175000.0, 150000.0, 125000.0]

1. 解决方法:

  • 需要删除:NaN
incoms=data['int_income'].dropna().unique().tolist()
print (incoms)
[75000.0, 50000.0, 0.0, 200000.0, 100000.0, 25000.0, 10000.0, 175000.0, 150000.0, 125000.0]
  • 如果所有值都只是整数:
incoms=data['int_income'].dropna().astype(int).unique().tolist()
print (incoms)
[75000, 50000, 0, 200000, 100000, 25000, 10000, 175000, 150000, 125000]
  • 或者通过numpy.isnan 选择所有非 NaN 值来删除:NaN
a = data['int_income'].unique()
incoms= a[~np.isnan(a)].tolist()
print (incoms)
[75000.0, 50000.0, 0.0, 200000.0, 100000.0, 25000.0, 10000.0, 175000.0, 150000.0, 125000.0]
  • 整数
a = data['int_income'].unique()
incoms= a[~np.isnan(a)].astype(int).tolist()
print (incoms)
[75000, 50000, 0, 200000, 100000, 25000, 10000, 175000, 150000, 125000]
  • 纯 python 解决方案 - 如果大,则更慢:DataFrame
incoms=[x for x in  list(set(data['int_income'])) if pd.notnull(x)]
print (incoms)
[0.0, 100000.0, 200000.0, 25000.0, 125000.0, 50000.0, 10000.0, 150000.0, 175000.0, 75000.0]
  • 整数
incoms=[int(x) for x in  list(set(data['int_income'])) if pd.notnull(x)]
print (incoms)
[0, 100000, 200000, 25000, 125000, 50000, 10000, 150000, 175000, 75000]

2. 列表list方法

您可以做的只是获取一个清理列表,其中您不会放置一旦转换为字符串就为“nan”的值。

代码将是:

incoms = [incom for incom in incoms if str(incom) != 'nan']
<think>好的,用户想知道Python pandas DataFrame中的空值类型,特别是NaN和None的区别。我需要先回顾pandas中处理空值的相关知识。 首先,pandas主要用NaN(Not a Number)来表示数值类型的缺失值,这是由NumPy提供的,属于float类型。而None是Python内置的,通常用于表示对象类型的缺失值。在DataFrame中,如果某一列是数值类型,pandas会自动将None转换为NaN,但如果是对象类型,比如字符串,None会被保留。 接下来,用户可能混淆这两种类型的区别,需要明确它们的类型差异和使用场景。例如,当使用isnull()或notnull()方法时,两者都会被识别为缺失值。但要注意,在比较操作中,NaN不等于任何值,包括自身,所以需要用专门的函数如pd.isna()来检测。 另外,用户提到的MySQL数据库的例子中,NaN不能直接存入,需要转换为None。这说明在处理数据导出时,类型转换很重要。可能需要使用fillna()方法或replace()方法来进行替换。 还需要注意,当DataFrame中的列类型为整数时,如果存在NaNpandas会自动将列转换为float,因为NaN是float类型。这时可以使用pd.NA(在较新版本中)来保持Nullable类型。 总结一下,回答的结构应该包括: 1. NaN和None的定义及类型区别。 2. 在DataFrame中的不同处理方式。 3. 检测和处理这两种空值的方法。 4. 实际应用中的注意事项和示例。 可能还需要提到pd.NA,特别是对于pandas 1.0以后版本引入的Nullable类型,但用户的问题可能更关注NaN和None,所以可以简要提及。 现在需要验证一些细节,比如在数值列中插入None是否会变成NaN,以及对象列中的NaN处理。例如,创建一个DataFrame测试: import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, None, 3], 'B': ['x', np.nan, None] }) 这里,列'A'会是float64类型,因为None被转换为NaN,而列'B'是对象类型,包含np.nan和None,但np.nan在对象列中会被视为浮点数NaN对象吗?可能实际存储为不同的类型,但pandas会将它们统一识别为缺失值。 此外,当导出到数据库时,NaN在非浮点数列中可能无法处理,所以替换为None是必要的,这时候可以用df.where(pd.notnull(df), None)来实现。 最后,确保回答中提到的函数如fillna()、isnull()的正确用法,以及类型转换的问题,帮助用户全面理解。</think>### Python pandas DataFrame空值类型解析 在Pandas中,空值主要涉及两种类型:$NaN$(Not a Number)和$None$,它们的底层实现和应用场景有本质区别。 --- #### 一、核心差异对比 | 类型 | 来源 | 数据类型 | 典型应用场景 | |--------|---------------|------------------|-------------------------| | NaN | NumPy | 浮点型(float64) | 数值列缺失值 | | None | Python内置 | 对象型(object) | 非数值列缺失值 | --- #### 二、具体行为特征 1. **自动类型转换** - 在数值列(如`int`/`float`)中使用$None$时,Pandas会强制转换为$NaN$: ```python df = pd.DataFrame({'col1': [1, None, 3]}) print(df.dtypes) # 输出: col1 → float64 ``` - 在对象列(如字符串列)中$NaN$和$None$会共存: ```python df = pd.DataFrame({'col2': ['A', np.nan, None]}) print(df['col2'].apply(type)) # 输出: [str, float, NoneType] ``` 2. **缺失值检测** - `isnull()`和`notnull()`会同时识别$NaN$和$None$: ```python df = pd.DataFrame({'col': [1, np.nan, None]}) print(df.isnull()) ``` 输出: ``` col 0 False 1 True 2 True ``` 3. **相等性判断** - $NaN$具有特殊性质:`np.nan != np.nan` - 必须使用`pd.isna()`进行检测: ```python print(pd.isna(np.nan)) # 输出: True ``` --- #### 三、数据处理实践 1. **空值替换** - 将$NaN$转换为$None$(适用于数据库导出): ```python df = df.where(pd.notnull(df), None) ``` - 将特定值替换为$NaN$: ```python df.replace('-', np.nan, inplace=True) ``` 2. **类型敏感操作** - 混合类型列中使用`fillna()`: ```python df['col'].fillna('UNKNOWN', inplace=True) # 对象列填充字符串 df['col'].fillna(0, inplace=True) # 数值列填充数字 ``` 3. **Nullable类型(Pandas 1.0+)** 使用`pd.NA`统一空值表示: ```python df = pd.DataFrame({'col': pd.Series([1, None], dtype='Int64')}) print(df['col'].dtype) # 输出: Int64 ``` --- #### 四、典型问题解析 > 引用案例:当尝试将包含$NaN$的DataFrame导入MySQL时,需要将$NaN$转换为$None$[^1]。这是因为MySQL不接受浮点型缺失值,但支持Python原生$None$。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别出BUG求求了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值