如何移除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
相关产品推荐
相关产品推荐

