使用applymap替换Pandas数据框中的空值

10
我有一个“年龄”列,但有时会显示NaN值。我知道我可以使用“fillna”来解决这个问题,但我尝试定义自己的函数(并学习以此方式操作)并将其应用于数据框,到目前为止没有成功。
Age
69
49
NaN
54
NaN

我已经尝试过

   def get_rid_of_nulls(value):
     if value == np.nan:
        return 'Is Null value'
     else:
        return value

这个也不起作用

 if value == None
   if value isnull
   if value == np.na
   if value ==''
   if value == NaN
   if value == 'NaN'

看起来没有任何比较是有效的。我肯定是错的,但现在我卡住了,非常固执地不想使用fillna。

谢谢


1
没有任何东西等于 nan,甚至 nan 本身也不行。你需要使用一个特殊的函数来检查一个值是否为 nan,不能使用 == - Alex Riley
在你的函数中使用 pd.isnull(value) - EdChum
2个回答

12

由于标题中涉及了“替换”,并且您提到了 fillna 方法,但没有提到 replace() 方法,因此您也可以通过以下方式获得相同的结果:

df.Age.replace(np.NaN, 'Is Null value', inplace=True)

# Or, depending on your needs:
df['Age'] = df.Age.replace(np.NaN, 'Is Null value')

# Or without `replace` :
df['Age'] = df.Age.apply(lambda x: x if not pd.isnull(x) else 'Is Null value')

1
不,这样行不通。NaN 本质上无法进行值相等性测试,只有你最后的代码片段才能正常工作。 - EdChum
好的,我的错误是传递了字符串“np.NaN”,这与实际情况不同。 - EdChum

3
您可以使用pd.isnull()
In [4]:
def get_rid_of_nulls(value):
    if pd.isnull(value):
        return 'Is Null value'
    else:
        return value

df['Age'].apply(get_rid_of_nulls)

Out[4]:
0               69
1               49
2    Is Null value
3               54
4    Is Null value
Name: Age, dtype: object

同样地,您可以利用 NaN 不等于自身的特性:

In [5]:
def get_rid_of_nulls(value):
    if value != value:
        return 'Is Null value'
    else:
        return value

df['Age'].apply(get_rid_of_nulls)

Out[5]:
0               69
1               49
2    Is Null value
3               54
4    Is Null value
Name: Age, dtype: object

иҝҷе°ұжҳҜ fillna зҡ„е…ЁйғЁз”ЁйҖ” - дҪҝз”ЁеөҢе…ҘдәҶ isnull жЈҖжҹҘзҡ„ .apply ж–№ејҸе®Ңе…ЁдёҚй«ҳж•ҲпјҢиҖҢдё”йңҖиҰҒжӣҙеӨҡзҡ„д»Јз ҒгҖӮ - Jeff
@jeff,这个操作知道fillna,但我同意这种方法很愚蠢。我猜测操作者只是想知道为什么他们的方法不起作用,而不是寻求最有效的方法。 - EdChum
好的,当谈到编程时,我总是喜欢指出apply是最后一个使用的工具。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接