【问题标题】:Using. np.isclose Function to compare two dataframes使用。 np.isclose 函数比较两个数据帧
【发布时间】:2022-01-16 21:54:22
【问题描述】:

我有两个具有相同大小和相同变量的数据框。

df1 size: (50, 3) 
df2 size: (50, 3)

在我的代码中,我使用 np.isclose 函数返回一个布尔数组,其中两个数组在容差范围内按元素相等:

feature_1 = np.isclose(df1["SepalLengthCm"], df2["SepalLengthCm"], atol=10)

feature_2 = np.isclose(df1["SepalWidthCm"], df2["SepalWidthCm"], atol=20)

feature_3 = np.isclose(df1["PetalLengthCm"], df2["PetalLengthCm"], atol=30)

代码运行正常,没有任何错误。 但对我来说,问题是我想让这个过程更加通用和自动化。换句话说,它应该适用于任何其他数据集。

重要的是我不想在代码中指定列名。所以我想使用for 循环自动遍历每一列并做同样的事情。

我不想像feature_1 feature_2 feature_3 那样为每一列设置三个代码(行),我想编写一个代码(行)来为任意数量的列执行相同的工作。像这样的:

feature = np.isclose(df1[columnn], df2[columnn], atol=i)

atol的参数也要提前预定义,例如i = [10, 20, 30]

【问题讨论】:

  • 那么你需要f = lambda col,atol: np.isclose(df1[col], df2[col], atol=atol) 吗?

标签: python pandas numpy


【解决方案1】:

您可以定义一个包含所需循环的函数,并将其称为单线:

def compare_isclose(df1, df2, atol_list):
    feature_list = []
    for i, col in enumerate(df1.columns):
        feature_list.append(np.isclose(df1[col], df2[col], atol=atol_list[i]))
    feature_df = pd.DataFrame.from_records(feature_list).T
    return feature_df

函数可以这样使用:

atol_list = [10,20,30]
feature_df = compare_isclose(df1, df2, atol_list)

它仅在 atol_list 中的元素数等于数据帧中的列数,并且 2 个数据帧的列名相同的假设下有效。

【讨论】:

  • 太好了,成功了!!还有一件事,我们如何将 feature_list 数组转换为 pd 数据框?新的数据框应该有三列。
  • 我编辑了答案以返回数据框而不是列表
  • 谢谢。最后,对于atol_list,我想从另一个数据框中获取值并将其放入atol_list。数据框有一个名为“tolerance”的列,其中包含三个值。所以我想把这些值输入atol_list
  • atol_list = df['tolerance'].values.tolist()
猜你喜欢
  • 2019-07-21
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多