我在pandas数据框中有两列应该是相同的。每列都有许多NaN值。我想比较列,产生包含True / False值的第3列;列匹配时 True ,否则 False 。
这就是我所尝试的:
df['new_column'] = (df['column_one] == df['column_two'])
以上适用于数字,但不适用于NaN值。
我知道我可以用每行中没有意义的值替换NaN(对于我的数据,这可能是-9999),然后在我准备好回应比较时将其删除结果,但我想知道是否有更多的pythonic方法我忽略了。
答案 0 :(得分:2)
或者你可以使用equals
方法:
df['new_column'] = df['column_one'].equals(df['column_two'])
这是一种包含电池的方法,无论dtype
还是细胞内容都可以使用。如果你愿意的话,你也可以把它放在循环中。
答案 1 :(得分:-1)
据我了解,Pandas认为NaN在元素方式相等和不平等比较方法上没有不同。比较整个Pandas对象(Series,DataFrame,Panel)时会这样做。
NaN值被认为是不同的(即NaN!= NaN)。 -source
基于元素的相等性声明.eq()
分别比较每行2列的值。这将返回一系列断言。
df['new_column'] = df['column_one'].fillna('-').eq(df['column_two'].fillna('-'))
选项2:之后使用.loc()
和.isna()
替换NaN断言。
df['new_column'] = df['column_one'].eq(df['column_two'])
df.loc[test['column_one'].isna() & test['column_two'].isna(),'new_column'] = True
请注意,对于 column_one 和 column_two 中的源数据,这两个选项都是非破坏性的。值得一看的是《 Pandas》文档中的working with missing data指南。
基于对象的平等声明.equals()
将Pandas对象(Series,DataFrame,Panel)作为一个整体进行比较,将所有行及其顺序解释为一个值。这将返回一个布尔值(标量)。
df['column_one'].equals(df['column_two'])
答案 2 :(得分:-1)
您可以使用如下所示的循环,并且只要您的数据帧是否包含NAN,只要两列的格式相同,它都可以工作
def Check(df):
if df['column_one']== df['column_two']:
return "True"
else:
return "False"
df['result'] = df.apply(Check, axis=1)
df