【问题标题】:Getting .eq to ignor NAN values让 .eq 忽略 NAN 值
【发布时间】:2015-08-29 21:10:37
【问题描述】:

我有一个看起来像的数据框 (df)

PID     SID     RID     
124     294     294
954     299     299
NAN     949     493
959     NAN     959
059     059     059 
0405    NAN     NAN
493     942     395

我用过

testdf = df.eq(df["PID"], axis='index').all(axis=1) 

要获得一个列表 (testdf) 来报告跨角色的值是否相等,除了 NAN 挡道之外,这是可行的。

我尝试使用

testdf = df.eq(df["PID"], axis='index').all(axis=1).notnull()

但由于某种原因,当我知道某些行不相等时,它会报告所有内容。

这是我希望 testdf 最终看起来像的示例

0    False
1    False
2    False
3    True
4    True
5    False
6    False

【问题讨论】:

  • 你的问题对我来说不是很清楚。您想将两个DataFramedf 和`df2)与相似数据进行比较?
  • 现在更新了,希望更清晰。
  • 我不明白为什么你认为输出不正确?
  • 好的,如果我理解你想获得PIDSID==RIDSID!=RID。对吗?
  • EdChum,当我使用 testdf = df.eq(df["PID"], axis='index').all(axis=1).notnull() testdef 报告一切为真,当我知道行中的某些值不相等。

标签: python python-3.x pandas ipython


【解决方案1】:

如果NaN 可以忽略,我们可以在每一列(RIDSID)中用彼此的值填充NaN。如果剩余值等于PID,则结果将为True,否则将为False。 您可以在 DataFrame 的副本上执行此操作,以免更改您的原始数据。

df['SID'] = df['SID'].fillna(df['RID'])
df['RID'] = df['RID'].fillna(df['SID'])
testdf = df.eq(df['PID'], axis='index').all(axis=1)
testdf

结果如下:

0    False
1    False
2    False
3     True
4     True
5    False
6    False

【讨论】:

  • 如果我只是将 SID 与 RID 进行比较,但如果 SID PID 和 RID 中的值相同但我希望它忽略 NAN,我想测试每一行(索引)。所以如果索引 3 为真。
  • 用我正在寻找的输出示例更新了原始帖子
  • 现在更清楚了。我已经修改了我的答案,告诉我它是否可以解决你的问题。
  • 很酷,即使我很难理解,对不起。
  • 如果可行,请不要忘记检查答案以关闭问题。
【解决方案2】:

这个问题是因为np.nan == np.nanFalsenp.nan != np.nanTrue。一个快速的解决方法是将dfdf2 中的任何nan 替换为您知道不在数据框中的内容,例如foo

df = df.fillna("foo")
df2 = df2.fillna("foo")

然后您可以根据需要比较您的数据框。

【讨论】:

  • 如果我用 foo 填充,在跨行比较时我不会仍然得到错误吗?
猜你喜欢
  • 2019-09-24
  • 2016-10-11
  • 1970-01-01
  • 2011-02-18
  • 2016-03-28
  • 2017-02-11
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
相关资源
最近更新 更多