【问题标题】:Drop dataframe rows with values that are an array of NaN删除值为 NaN 数组的数据帧行
【发布时间】:2020-07-22 06:52:42
【问题描述】:

我有一个数据框,在其中的一列中,我得到了一些值,这些值不仅仅是“NaN”,而是一个 NaN 数组(即“[nan, nan, nan]”)

我想将这些值更改为 0。如果它只是“nan”,我会使用:

df.fillna(0)

但这在这种情况下不起作用。

例如,如果:

df1 = pd.DataFrame({
         'ID':[1,2,3,4,5,6],
         'Version':[1,1,2,2,1,2],
         'Cost':[17,np.nan,24,[np.nan, np.nan, np.nan],13,8]})

使用 df1.fillna(0) 产生:

   ID  Version             Cost
0   1        1               17
1   2        1                0
2   3        2               24
3   4        2  [nan, nan, nan]
4   5        1               13
5   6        2                8

当我想得到输出时:

   ID  Version             Cost
0   1        1               17
1   2        1                0
2   3        2               24
3   4        2                0
4   5        1               13
5   6        2                8

【问题讨论】:

  • 请提供mcve
  • 编辑提供一个

标签: python pandas fillna


【解决方案1】:

在您的情况下,列Cost 是一个对象,因此您可以先转换为数字,然后再转换为fillna

import pandas as pd

df = pd.DataFrame({"ID":list(range(1,7)),
                   "Version":[1,1,2,2,1,2],
                   "Cost": [17,0,24,['nan', 'nan', 'nan'], 13, 8]})

在哪里df.dtypes

ID          int64
Version     int64
Cost       object
dtype: object

因此,您可以使用 errors='coerce' 转换此列 to_numeric,这意味着如果无法转换,则分配一个 np.nan。

df["Cost"] = pd.to_numeric(df["Cost"], errors='coerce')\
               .fillna(0)

或者如果您喜欢分两步进行

df["Cost"] = pd.to_numeric(df["Cost"], errors='coerce')
df["Cost"] = df["Cost"].fillna(0)

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2012-07-22
    • 2015-09-08
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多