检查python中float列的相等性

时间:2018-04-02 18:10:29

标签: python pandas compare

我有一个包含2个包含浮点数的列的数据框。我首先排除列包含零的行,然后想要检查每一行,如果列的元素相等。

我试过了:

df.loc[(df['col1'] != 0.0) & (df['col2'] != 0.0), 'Error'] = np.where(assert_almost_equal(df['col1'], df['col2']), 'Not equal', '')

结果是:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

并尝试过:

np.where(df['col1'] == df['col2'], 'Not equal', '')

np.where(df.col1.eq(df.col2), 'Not equal', '')

结果是:

ValueError: shape mismatch: value array of shape (24788,) could not be broadcast to indexing result of shape (9576,)

并尝试apply - 功能。

如何逐行比较两列中的浮点数?我确实希望需要平等,而不是isclose或类似的东西。

谢谢,

MAMO

3 个答案:

答案 0 :(得分:2)

你能试试吗?在开头过滤

df=df.loc[(df['col1'] != 0.0) & (df['col2'] != 0.0),:]
df['Error'] = np.where(assert_almost_equal(df['col1'], df['col2']), 'Not equal', '')

原因

  

ValueError:形状不匹配:形状的值数组(24788,)不可能   广播到形状的索引结果(9576,)

你在做np.where时过滤它,所以你的df成了原始df的子集,但在你的np.where中,df仍然是原始的df,这就是为什么大小不同

24788:原始大小,9576:排除行的大小,其中列包含零

答案 1 :(得分:2)

我认为需要将所有蒙版链接在一起以获得相同大小的布尔掩码和DataFrame以避免shape mismatch valueError并且不会更改DataFrame的原始大小:

df = pd.DataFrame({'col1':[0,5,4,5.7,5,4],
                   'col2':[0,0,9,5.7,2,3],
                   'col3':[1,3,5,7,1,0]})

#print (df)

mask=(df['col1'] != 0.0) & (df['col2'] != 0.0) & (df['col1'] == df['col2'])
df['Error'] = np.where(mask, 'Equal', 'Not equal')
print (df)
   col1  col2  col3      Error
0   0.0   0.0     1  Not equal
1   5.0   0.0     3  Not equal
2   4.0   9.0     5  Not equal
3   5.7   5.7     7      Equal
4   5.0   2.0     1  Not equal
5   4.0   3.0     0  Not equal

答案 2 :(得分:0)

  

如何逐行比较两列中的浮点数?

我建议像这样使用pandas fix_versions = [] for version in issue["fields"]["fixVersions"]: if version['name'][:8] == "Clignra ": version_match = re.findall(r"(\d+\.\d+)\.\d+\.\d+", version['name']) if version_match: fix_versions.append(version_match[0]) print(fix_versions) # `['4.4', '4.4', '4.5']` etc. or similar # or: print("[{}]".format(", ".join(fix_versions))) # `[4.4, 4.4, 4.5]` etc.

apply