pandas 比较其他列元素的嵌套列并计算准确率百分比

qoefvg9y  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(59)

假设我有两个不等长的三角形,df 1df 2
第一个框架df 1看起来像这样:

id | a   |  b  |  c  |  d
--------------------------
i1 | 1,2 |  0  | Nan |  3
i2 |  1  |  4  |  2  | 0,3
i3 |  0  |  1  | 2,3 | Nan

字符串
第二个框架df 2看起来像这样:

id | a   |  b  |  c  |  d
--------------------------
i5 | 0,3 |  1  | 2,4 | Nan
i2 |  1  |  4  |  2  |  0
i3 |  0  |  1  | 2,3 | Nan
i4 |  0  |  1  | 2,3 | Nan
i1 |  1  |  0  | Nan |  3


两个嵌套框具有相同的列名;a,b,c & d。它们可能在列id中具有相同的元素,但不一定具有相同的顺序。
现在,对于列id中的每个常见id号,我想比较所有列a,b,c和d的值并计算准确率百分比。
例如,让我们看看id号i1,在df 1中,列a中的值对于这个id号是1,2,但是在df 2中,具有相同的id号i1,列a中的值为1。因此缺少值2,因此准确度应该是50%左右.这将对每一列和每一行重复.如果id号在df 2中不存在df 1或相反,它应该被忽略.我想计算最终的准确率百分比,并能够可视化匹配的元素和不匹配的元素.
为了比较列a,我尝试了这样的方法:

new_df2 = df2[df2.id.isin(df1.id)]

acc = (df1.sort_values('id')['a'].reset_index()==new_df2.sort_values('id')['a'].reset_index()).mean()


我不确定这是否正确,或者这是否是最好的方法。有什么建议吗?

vecaoik1

vecaoik11#

您可以使用自定义函数来计算Jaccard index,将每个项目转换为set,对齐两个DataFrame并以矢量方式应用它:

from numpy import vectorize

@vectorize
def compare(a, b):
    A = set(map(int, a.split(','))) if isinstance(a, str) else {a}
    B = set(map(int, b.split(','))) if isinstance(b, str) else {b}
    return len(A&B)/len(A|B) # multiply by 100 for %

tmp = df1.set_index('id')

out = (pd.DataFrame(compare(tmp, df2.set_index('id').reindex_like(tmp)),
                    index=tmp.index, columns=tmp.columns)
         .reset_index()
      )

字符串
输出量:

id    a    b    c    d
0  i1  0.5  1.0  1.0  1.0
1  i2  1.0  1.0  1.0  0.5
2  i3  1.0  1.0  1.0  0.0

相关问题