python pandas 如何找到NaN、缺失值或者某些元素的索引名称以及位置,np.where的使用

本文介绍了一种利用np.where()函数查找特定值在数据集中的位置的方法,并演示了如何定位缺失值NaN的具体位置,包括行号、列号及对应的索引名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在处理数据的时候,经常需要检查数据的质量,也需要知道出问题的数据在哪个位置。我找了很久,也尝试了很多办法,都没能找到一种非常直接的函数,本文所要介绍的是一种我认为比较方便的方法:np.where()


我举个例子

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(12).reshape(4,3), index=list('abcd'), columns=list('xyz'))

In [14]:df
Out[14]: 
   x   y   z
a  0   1   2
b  3   4   5
c  6   7   8
d  9  10  11

比如你想找到 5 的位置,你想知道它在第几行,第几列

In [16]: np.where(df==5)
Out[16]: (array([1], dtype=int64), array([2], dtype=int64))

可以看到结果返回了一个元祖tuple,里面有两个元素,都是np.ndarray类型的,第一个是行号,第二个是指明列的位置,所以5 是在第2行,第3列

如果我们想检查数据里面掺杂的缺失值NaN的位置的,同样可以用此方法。

# 首先我们将df的第一列变成NaN
df.x = np.nan
df
Out[18]: 
    x   y   z
a NaN   1   2
b NaN   4   5
c NaN   7   8
d NaN  10  11

# 然后查查NaN的位置,在写这篇blog的时候我也遇到了一个奇怪的事,上面我用np.nan赋值后,然后用df == np.nan判断,结果很奇怪

In [28]: df == np.nan
Out[28]: 
       x      y      z
a  False  False  False
b  False  False  False
c  False  False  False
d  False  False  False

# 但是用 numpy 的另一个函数 np.isnan, 却可以判断出nan,具体原因还需要再研究研究

np.isnan(df)
Out[25]: 
      x      y      z
a  True  False  False
b  True  False  False
c  True  False  False
d  True  False  False

# 因此接我们最初的目的,找出NaN的位置

np.where(np.isnan(df))
Out[32]: (array([0, 1, 2, 3], dtype=int64), array([0, 0, 0, 0], dtype=int64))

np.where(np.isnan(df))[0] # 选出tuple里面的第一个元素,也就是行号
Out[33]: array([0, 1, 2, 3], dtype=int64)

但如果你觉得只知道行号,列号不能满足你的需求,还想知道元素的索引名称

# 我们现在的df是这个样子的
df
Out[34]: 
    x   y   z
a NaN   1   2
b NaN   4   5
c NaN   7   8
d NaN  10  11

# 加入你想知道 NaN 所在的索引,列名,只需要在前面加上 df.index, df.columns 即可

In [35]: df.index[np.where(np.isnan(df))[0]] 
Out[35]: Index(['a', 'b', 'c', 'd'], dtype='object')
# df.index 是获取行名称,对应后面的[0]取行号

In [36]: df.columns[np.where(np.isnan(df))[1]]
Out[36]: Index(['x', 'x', 'x', 'x'], dtype='object')
# df.columns 是获取列名称,对应后面的[1]取列号

Over

参考资源链接:[Python数据清洗:numpypandas实战入门](https://wenku.csdn.net/doc/6401abe8cce7214c316e9f0a?utm_source=wenku_answer2doc_content) 在数据科学和分析领域,numpypandas是不可或缺的工具,它们提供了强大的数据处理功能,特别是在数据清洗与预处理方面。为了更好地掌握这些技术,推荐查看资源《Python数据清洗:numpypandas实战入门》,该资源深入浅出地介绍了numpypandas在数据清洗中的应用。 首先,numpy的ndarray对象是进行数组排序的基础。可以通过np.sort函数对数组进行排序,例如`sorted_array = np.sort(arr)`将对数组arr进行排序并返回一个新的排序数组。对于一维数组,可以使用`np.argsort`来获取排序后的索引。对于多维数组,numpy提供`axis`参数来指定排序的轴。 其次,numpy的搜索功能也非常有用。使用`np.argmax`或`np.argmin`可以快速找到数组中最大值或最小值的索引。通过`np.where`函数,可以找到满足特定条件的元素索引,这对于数据筛选非常有用。 在pandas中,数据清洗可以从Series和DataFrame两个数据结构出发。Series可以看作是带有标签的数组,而DataFrame则是二维的表格数据结构,类似于Excel表格或SQL表。 处理缺失值是数据清洗的一个重要步骤。在pandas中,可以使用`fillna`方法来填充缺失值或者使用`dropna`方法删除包含缺失值的行或。例如,`df.fillna(0)`会将DataFrame df中所有的NaN替换为0。 数据类型转换在数据清洗过程中同样重要。可以使用`astype`方法将DataFrame中的某一数据类型转换为其他类型,如将字符串转换为整数。例如,`df['column_name'] = df['column_name'].astype(int)`将指定转换为整数类型。 条件筛选是pandas的核心功能之一,通过`loc`和`iloc`可以基于标签或位置选取数据。`loc`使用标签进行筛选,而`iloc`使用整数位置索引。例如,`df.loc[rows, cols]`可以根据行标签和标签来筛选数据,而`df.iloc[row_position, col_position]`则基于位置进行筛选。 数据聚合方面,`groupby`方法允许我们对数据进行分组,并可以使用`agg`、`mean`、`sum`等函数对分组后的数据进行聚合计算。例如,`df.groupby('group_column').mean()`将返回按照'group_column'分组后的数据的平均值。 掌握了这些基础知识后,你可以进一步通过实际操作提升数据清洗的技能。《Python数据清洗:numpypandas实战入门》不仅能够帮助你入门,还能在你遇到具体问题时提供解决方案和实际操作的示例。 参考资源链接:[Python数据清洗:numpypandas实战入门](https://wenku.csdn.net/doc/6401abe8cce7214c316e9f0a?utm_source=wenku_answer2doc_content)
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值