比较 pandas/numpy 中的 NaN 列

Posted

技术标签:

【中文标题】比较 pandas/numpy 中的 NaN 列【英文标题】:Comparing NaN columns in pandas/numpy 【发布时间】:2016-05-26 23:27:56 【问题描述】:

我想比较数据框中可能包含 NaN 值的两列。

基于link,我尝试调整我的代码,但遇到以下问题:

(s1[s1.notnull()] == s2[s2.notnull()]).all()

如何调整此代码,以便我不需要从数据框中提取 s1 和 s2 作为系列,而是可以直接应用它:

import pandas as pd
import numpy as np

mydata = ['SystemA': 1.78, 'SystemB':1.78,
          'SystemA': 2.5, 'SystemB':2.5,
          'SystemA': np.nan, 'SystemB':np.nan]

df = pd.DataFrame(mydata)
print(df)

# does not return single True or False
# gives wrong result when e.g. 2.5 is changed to 2.6 in just one column
c =  (df['SystemA'].notnull() == df['SystemB'].notnull()).all()

print('\nc:',c)

【问题讨论】:

对不起,我不明白你在这里追求什么,你的代码按预期工作,你想在这里测试什么? 不幸的是,如果我将“SystemA”中的 2.5 更改为 2.6,它也会返回“True”。 @Uwe 这是预期的行为。你知道.notnull() 是做什么的吗? 当然。你说的对!过失 【参考方案1】:

equals 方法忽略了 nans:

>>> df
   SystemA  SystemB
0     1.78     1.78
1     2.50     2.50
2      NaN      NaN
>>> (df["SystemA"] == df["SystemB"]).all()
False
>>> df["SystemA"].equals(df["SystemB"])
True
>>> df.iloc[1,1] = 2.6
>>> df
   SystemA  SystemB
0     1.78     1.78
1     2.50     2.60
2      NaN      NaN
>>> df["SystemA"].equals(df["SystemB"])
False

虽然它也会检查 dtype 是否相等,所以如果你有一系列整数和一系列浮点数,即使你有,它也会说它们不相等

>>> ((df.SystemA == df.SystemB) | (df.SystemA.isnull() & df.SystemB.isnull())).all()
True

这对您来说可能是也可能不是问题。

【讨论】:

【参考方案2】:

这就是你要找的东西:

df['SystemA'].dropna() == df['SystemB'].dropna()

?

【讨论】:

我认为它确实如此,因为它会从每个系列中删除 NaN 并比较剩余的行。与链接示例中的 isnull() 比较一起,我认为应该足够了(需要考虑一下)。【参考方案3】:
mydata = ['SystemA': 1.78, 'SystemB':1.78,
          'SystemA': 2.5, 'SystemB':2.5,
          'SystemA': np.nan, 'SystemB':np.nan]

df = pd.DataFrame(mydata)

这将得到两个列都为空的行:

df[pd.isnull(df['SystemA']) & (pd.isnull(df['SystemB']))]

    SystemA     SystemB
 2  NaN     NaN

这将为您提供两个列都不为空的行:

df[(df['SystemA'].notnull()) & (df['SystemB'].notnull())]

SystemA     SystemB
0   1.78    1.78
1   2.50    2.50

我假设你是其中之一?

【讨论】:

这里我得到“TypeError: list indices must be integers, not str”两行代码 哦,对不起,我将mydata 分配给了一个DataFrame,我会编辑 如果所有比较成功或失败,我有办法找回单个 TrueFalse 查看 DSM 对您的 True / False 的回答 :)

以上是关于比较 pandas/numpy 中的 NaN 列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas/Numpy NaN 无比较

比较两列中的值

如何在 pandas/numpy 中将值扩展到下一个非空值? [复制]

pandas:用列中的最后一个非 NaN 值替换 NaN [重复]

DataFrame中统计某几列中字符出现次数并比较

将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值