【问题标题】:How to remove nan values from a dataframe column when notnull, dropna and != 'nan' don't work?当 notnull、dropna 和 != 'nan' 不起作用时,如何从数据框列中删除 nan 值?
【发布时间】:2021-08-26 08:57:55
【问题描述】:

我有一个包含以下列和数据类型的数据框:

np_id                     object
target_id                 object
activity_type             object
activity_value            object
activity_units            object
assay_cell_type           object
SMILES                    object
standard_inchi_key        object
standard_inchi            object
target_type               object
target_name               object
target_organism_tax_id    object
target_organism           object
uniprot_id                object
dtype: object

df.uniprot_id 看起来像这样:

0            [nan]
1         [Q96KQ7]
2            [nan]
3         [P25779]
4            [nan]
            ...   
493830       [nan]
493831       [nan]
493832       [nan]
493833       [nan]
493834       [nan]

而df['uniprot_id'].isnull().values.any() 给出False

我想删除所有没有 uniprot_id 的行。我尝试了以下方法:

df.dropna(subset=['uniprot_id'], inplace=True)

df = df[df['uniprot_id'] != 'nan']

df = df[df['uniprot_id'] != 'NaN']

df[df.uniprot_id.notnull()]

为什么我的尝试不起作用?如何删除 nan 值,从而从数据框中删除行?

【问题讨论】:

  • 据我了解,您的[nan] 值是(一个)元素nan 的列表,不是吗?在dropna 之前使用@Tom 回答替换它们。请记住,@Tom 理解那些是 ('[nan]') 字符串,我认为这些是列表......无论如何,这个概念是 (你没有纯 nan/None 对象在那些细胞)
  • @Brandt 实际上你可能是对的,我只是说字符串,因为这是我在复制他的示例 df 后使用 pd.read_clipboard() 时发生的事情,但经过一些测试后,它很可能是一个专门持有的列表一个 np.nan(而不是一个 None)

标签: python pandas dataframe nan


【解决方案1】:

[nan] 被格式化为 nan 列表。将其替换为真正的 nan 值,如下所示:

nan_locs = pd.isnull(df['uniprot_id'].apply(lambda x: x[0]))
df['uniprot_id'][nan_locs] = np.nan

那么你的代码应该可以工作了。但是,您可能还想考虑只将每个项目从列表中取出,除非有理由将它们放入列表中:

df['uniprot_id'] = df['uniprot_id'].apply(lambda x: x[0])

【讨论】:

  • 嘿,我使用了您的代码,后跟df.dropna(subset=['uniprot_id'], inplace=True),但列中仍然有[nan]。我还能尝试什么?
  • @Gabriel 我修改了我的代码,希望可以工作
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2017-01-13
  • 2016-02-12
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多