如何遍历数据框的行并检查列行中的值是不是为 NaN
Posted
技术标签:
【中文标题】如何遍历数据框的行并检查列行中的值是不是为 NaN【英文标题】:How to iterate through rows of a dataframe and check whether value in a column row is NaN如何遍历数据框的行并检查列行中的值是否为 NaN 【发布时间】:2016-01-12 11:16:45 【问题描述】:我有一个初学者问题。我有一个正在迭代的数据框,我想检查 column2 行中的值是否为NaN
,如果它不是NaN
,则对该值执行操作。我的 DataFrame 如下所示:
df:
Column1 Column2
0 a hey
1 b NaN
2 c up
我现在正在尝试的是:
for item, frame in df['Column2'].iteritems():
if frame.notnull() == True:
print 'frame'
这背后的想法是,我对第 2 列中的行和 print
帧中的每一行都有一个值(这是一个字符串)进行迭代。然而,我得到的是:
AttributeError Traceback (most recent call last)
<ipython-input-80-8b871a452417> in <module>()
1 for item, frame in df['Column2'].iteritems():
----> 2 if frame.notnull() == True:
3 print 'frame'
AttributeError: 'float' object has no attribute 'notnull'
当我只运行我的代码的第一行时,我得到了
0
hey
1
nan
2
up
这表明第一行输出中的浮点数是错误的原因。谁能告诉我如何才能完成我想要的?
【问题讨论】:
【参考方案1】:试试这个:
df[df['Column2'].notnull()]
上面的代码会给你Column2
没有空值的数据
【讨论】:
【参考方案2】:如你所见,frame
in
for item, frame in df['Column2'].iteritems():
是列中的每个row
,其类型将是列中元素的类型(很可能不是Series
或DataFrame
)。因此,frame.notnull()
将不起作用。
你应该试试 -
for item, frame in df['Column2'].iteritems():
if pd.notnull(frame):
print frame
【讨论】:
它的工作原理是只打印帧(行),但nan
值仍然存在。但是为什么帧值应该是字符串时会浮动?
Pandas 将所有缺失值表示为浮点数nan
您可以使用pd.notnull()
来检查该值是否不是NaN
。如果您还想过滤掉空字符串/ None 值,您也可以这样做 - if frame and pd.notnull(frame):
。
@AnandSKumar 好的,这行得通。我想我之前尝试过时调用 .notnull() 是错误的。非常感谢!【参考方案3】:
在 Series 上使用 iteritems
(这是从 DataFrame 中获取列时得到的结果)迭代对(索引、值)。因此,您的 item
将在循环的三个迭代中采用值 0、1 和 2,而您的 frame
将采用值 'hey'
、NaN
和 'up'
(所以“帧”是可能是一个坏名字)。错误来自尝试在NaN
(表示为浮点数)上使用方法notnull
。
您可以改用函数pd.notnull
:
In [3]: pd.notnull(np.nan)
Out[3]: False
In [4]: pd.notnull('hey')
Out[4]: True
另一种方法是在整个系列上使用notnull
,然后遍历这些值(现在是布尔值):
for _, value in df['Column2'].notnull().iteritems():
if value:
print 'frame'
【讨论】:
感谢错误的解释,不知道nan被呈现为浮点数!以上是关于如何遍历数据框的行并检查列行中的值是不是为 NaN的主要内容,如果未能解决你的问题,请参考以下文章
在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在