比较Pandas数据帧的列是否相等以产生True / False,甚至是NaN

时间:2016-09-15 02:34:32

标签: python pandas dataframe

我在pandas数据框中有两列应该是相同的。每列都有许多NaN值。我想比较列,产生包含True / False值的第3列;列匹配时 True ,否则 False

这就是我所尝试的:

df['new_column'] = (df['column_one] == df['column_two'])

以上适用于数字,但不适用于NaN值。

我知道我可以用每行中没有意义的值替换NaN(对于我的数据,这可能是-9999),然后在我准备好回应比较时将其删除结果,但我想知道是否有更多的pythonic方法我忽略了。

3 个答案:

答案 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列的值。这将返回一系列断言。

选项1 :将.eq()方法与.fillna()链接。

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