【问题标题】:How to test for nan's in an apply function in pandas?如何在 Pandas 的应用函数中测试 nan?
【发布时间】:2016-05-15 22:26:43
【问题描述】:

我有一个简单的apply 函数,我在某些列上执行。但是,它不断被pandas 中的NaN 值绊倒。

input_data = np.array(
[
[random.randint(0,9) for x in range(2)]+['']+['g'],
[random.randint(0,9) for x in range(3)]+['g'],
[random.randint(0,9) for x in range(3)]+['a'],
[random.randint(0,9) for x in range(3)]+['b'],
[random.randint(0,9) for x in range(3)]+['b']
]
)

input_df = pd.DataFrame(data=input_data, columns=['B', 'C', 'D', 'label'])

我有一个像这样的简单 lambda:

input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if not np.isnan(aCode) else aCode)

它会被 NaN 值绊倒:

File "<pyshell#460>", line 1, in <lambda>
    input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if not np.isnan(aCode) else aCode)
TypeError: Not implemented for this type

所以,我尝试只测试 Pandas 添加的 nan 值:

np.isnan(input_df['D'].values[0])
np.isnan(input_df['D'].iloc[0])

两者都得到相同的错误。

我不知道如何测试 np.isnan 以外的 nan 值。有没有更简单的方法来做到这一点?谢谢。

【问题讨论】:

  • input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if pd.notnull(aCode) else aCode) 工作,但你想做什么?
  • 例如这做同样的事情:input_df['D'].str.replace('\.', '')
  • 您可以使用math.isnan() 来测试 nan 值。
  • pd.notnull 有效。但我是唯一一个对np.isnan 不起作用感到惊讶的人吗?我以为熊猫空值是建立在np nans?
  • np.isnan 不理解空字符串这就是原因

标签: python pandas dataframe nan


【解决方案1】:

您的代码失败,因为您的第一个条目是一个空字符串并且np.isnan 不理解空字符串:

In [55]:
input_df['D'].iloc[0]

Out[55]:
''

In [56]:
np.isnan('')

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-a9f139a0c5b8> in <module>()
----> 1 np.isnan('')

TypeError: Not implemented for this type

ps.notnull 确实有效:

In [57]:
import re
input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if pd.notnull(aCode) else aCode)

Out[57]:
0     
1    3
2    3
3    0
4    3
Name: D, dtype: object

但是,如果您只想替换某些内容,则只需使用 .str.replace:

In [58]:
input_df['D'].str.replace('\.','')

Out[58]:
0     
1    3
2    3
3    0
4    3
Name: D, dtype: object

【讨论】:

  • 很好,谢谢。我看到字符串替换更容易也更优雅,但我试图更好地理解NaNs。如何人工创建NaN?我认为np.nan 是这样做的方法,但熊猫并不总是将其转换为数据框/系列中的NaN。它也不会将 '' 转换为 NaN 值。如何在 pandas 中创建 NaN 值?
  • NaN 是浮点类型,字符串中没有等价物,您可以在 str 列中使用 NaN,这将使该列成为混合 dtype。您必须决定什么构成字符串中的缺失值,空字符串会很好,但 np 无法识别空白/空字符串,因为它识别 NaN 值的方式相同
  • 所以,我想真的没有办法在object 类型的列中表示NaN?所以,如果我有一列字符串,其中一些是 NaN,我必须在使用 pd.DataFrame.dropna() 删除 NaNs 之前将列值转换为浮点数?这似乎有点麻烦......
  • 你可以有字符串和浮动NaN,列类型将来自object,但在这种情况下它真的是混合dtypesdropna可以工作,但它会使一些操作失败方法期望所有str 或所有floats,实际上你应该决定什么应该是缺失值,这样一个空字符串就可以了,在这种情况下你可以使用df['col'] == '' 检测到
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 2022-01-06
  • 2017-10-19
  • 2018-06-06
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多