You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除DataFrame中含numpy数组空值的行?解决TypeError报错

解决DataFrame移除含numpy数组空值行时的TypeError问题

嘿,这个问题我碰到过,来给你捋清楚怎么解决!首先咱们得明白为啥会弹出TypeError: unhashable type: 'numpy.ndarray'——这是因为你大概率尝试用了== np.nan或者isin()这类操作,而numpy数组是不可哈希的对象,没法直接做这些比较。下面分两种常见场景给你对应方案:

场景1:单元格内的numpy数组包含空值

如果你的需求是移除那些数组里存在至少一个nan的行(比如单元格值是np.array([np.nan, 3])),可以用apply()结合np.isnan().any()逐个检查每个数组:

import pandas as pd
import numpy as np

# 模拟你的目标DataFrame
df = pd.DataFrame({
    'array_col': [np.array([1,2]), np.array([np.nan, 3]), np.array([4, np.nan]), np.array([5,6])],
    'desc': ['正常行', '含空值数组行', '含空值数组行', '正常行']
})

# 过滤掉数组内存在空值的行
filtered_df = df[~df['array_col'].apply(lambda arr: np.isnan(arr).any())]
print(filtered_df)

运行后的预期输出:

array_col    desc
0  [1. 2.]  正常行
3  [5. 6.]  正常行

场景2:单元格本身就是np.nan

如果某些单元格直接存的是np.nan(不是数组),那处理起来更简单,用pandas自带的方法就能搞定:

df = pd.DataFrame({
    'array_col': [np.array([1,2]), np.nan, np.array([4,5]), np.nan],
    'desc': ['正常行', '空值单元格行', '正常行', '空值单元格行']
})

# 方法1:直接用dropna移除空值行
filtered_df = df.dropna(subset=['array_col'])

# 方法2:用pd.isna做判断过滤
filtered_df = df[~df['array_col'].apply(pd.isna)]

输出结果:

array_col    desc
0  [1. 2.]  正常行
2  [4. 5.]  正常行

为啥之前的代码会报错?

举个例子,如果你尝试写df[df['array_col'] != np.nan],numpy数组和np.nan比较会返回一个布尔数组,pandas没法把这个数组当成行索引的判断条件;而如果用df[df['array_col'].isin([np.nan])],isin()需要把元素存入哈希表,但numpy数组是不可哈希的,所以直接抛出了那个TypeError。

核心思路就是:别直接对numpy数组对象做需要哈希的比较操作,而是用apply()逐个处理每个单元格里的数组~

内容的提问来源于stack exchange,提问作者doyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:42:22