我有两个大小相同、变量相同的数据帧。
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]
您可以定义一个包含所需循环的函数,并将其称为一行:
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中的元素数量等于数据帧中的列数量,并且两个数据帧的列名相同的情况下工作。