在csv文件中按行计算差异数

jdzmm42g  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(61)

请帮帮忙!!我需要Python代码
有一个csv文件,它有大量的行和列。
有必要通过比较所有列中的每一行来计算差异数。
例如:id为12180的行与id为12188的行有3列不同,则将id为12180的行与id为13371的行进行比较,并假设它们之间有1个不同,根据这个原理,需要比较文件中的所有行
| ID|男子头衔|艺术|标题| 10239 | 10240 | 10241 | 10242 |
| --|--|--|--|--|--|--|--|
| 12180 |SDVQO| qw| 300 TDE XL C| 2 |EF| ATM| 12 |
| 12188 |SDVQO| qw| VX 220| 1 |EF| ATM| RR4|
| 13371 |SDVQO| qw| VX 200/4 H-C| 2 |EF| ATM| 12 |
结果应该写入一个新的csv文件,该文件将显示被比较的行的ID和与之比较并找到差异的行的ID。第三列是比较这些行时的匹配数
| ID1| ID2|差异|
| --|--|--|
| 12180 | 12188 | 3 |
| 12188 | 13371 | 1 |
我试图计算每个唯一行的重复数,但这并不是我所需要的。

nwlqm0z1

nwlqm0z11#

一个可能的解决方案:

from itertools import combinations

combs = pd.DataFrame(combinations(df["id"], 2), columns=["id1", "id2"])

left = df.set_index("id").loc[combs["id1"]].reset_index()
right = df.set_index("id").loc[combs["id2"]].reset_index()

out = combs.assign(differences=left.ne(right).sum(axis=1).sub(1))

字符串
或者,因为你有一个小的df,一个选择是self cross并计算差值:

cross = (df.merge(df, how="cross", indicator=True,
         suffixes=("_l", "_r")).loc[lambda x: x[["id_l", "id_r"]]
            .agg(sorted, axis=1).duplicated()])

left = cross.filter(like="_l").drop("id_l", axis=1)
right = cross.filter(like="_r").drop("id_r", axis=1)

diff = left.ne(right.set_axis(left.columns, axis=1)).sum(axis=1)

out = (cross[["id_l", "id_r"]].set_axis(["id1", "id2"], axis=1)
        .assign(differences = diff).reset_index(drop=True))


输出量:

print(out)

     id1    id2  differences
0  12180  12188            3
1  12180  13371            1
2  12188  13371            3

相关问题