比较 pandas 数据框列并为相同的列提供相同的分数

Comparing pandas data frame columns and giving the same score to identical columns

提问人:anna lordian 提问时间:7/23/2023 最后编辑:Markanna lordian 更新时间:9/26/2023 访问量:40

问:

考虑一个包含 24 行的数据框。我需要比较所有列,对于相同的列,给出相同的分数。 例如,如果 column 与 column 和 相同,则它们都应该获得分数。pandasACF1

然后,如果列与列相同,则它们将获得分数。 如果可能的话,我希望分数在所有行中都以新列的形式显示。 因此,例如,如果行获得了分数,则包含 24 行的新列将包含 24 次数字\字符串,每行一次BZ2A1score_A1

我尝试了几种策略。他们导致了不合逻辑的结果

Python Pandas 数据帧 排序 比较

评论

0赞 Jan 7/23/2023
假设与 相同,则得到 1 分。稍后将针对其他列进行测试。问题 1:是否应该针对以下列或所有列(从 on 或从 on)进行测试?问题 2:如果相同,那么 1 分是用 2 分代替还是只得到 2 分?ACCCCDACDCD
0赞 Mark 7/24/2023
嗨,安娜!欢迎来到 StackOverflow!
0赞 Mark 7/24/2023
快速提问:如果 A 和 B 在同一组,但 C 不在,C 会得到 2 分,还是 3 分?
0赞 anna lordian 7/25/2023
C 将获得 2 分

答:

0赞 Mark 7/24/2023 #1

这是一种方法:

import pandas as pd

df = pd.DataFrame({
    'a': [1, 2, 3],
    'b': [4, 5, 6],
    'c': [1, 2, 3],
    'd': [7, 8, 9],
    'e': [4, 5, 6],
    'f': [1, 2, 3],
    'g': [9, 10, 11]
})

seen = []
score = 1
for col in df.columns:
    if not col in seen: # if the column is new to us
        seen.append(col) # add it to the seen list
        df['score_'+ col] = score # then add the score of it as a column to the df
        for new_col in [c for c in df.columns if c not in seen]: # for every column that we haven't seen yet
            if df[col].equals(df[new_col]): # if it is the same as our current column
                df['score_'+ new_col] = score # then add a score column for it with the current score
                seen.append(new_col)
        score += 1

>>> df
   a  b  c  d  e  f   g  score_a  score_c  score_f  score_b  score_e  score_d  score_g
0  1  4  1  7  4  1   9        1        1        1        2        2        3        4
1  2  5  2  8  5  2  10        1        1        1        2        2        3        4
2  3  6  3  9  6  3  11        1        1        1        2        2        3        4

评论

0赞 anna lordian 7/25/2023
感谢您的帮助 - 我遇到了一个问题 - 我尝试过的代码遇到的相同问题,代码的结果是所有列都彼此不同。事实并非如此,实际上有很多身份
0赞 Mark 7/25/2023
对不起,你能为我改写一下吗?我不关注
0赞 anna lordian 7/25/2023
是的 - 问题在于代码的结果是所有列都彼此不同,即使事实并非如此。例如,如果 A 、 B 、 C 列相同并且需要获得相同的分数,则它们将获得不同的分数
0赞 Mark 7/25/2023
所以你是说我的代码在你的实际数据集上不起作用?从数据中提供实际示例以及预期的输出可能更简单
0赞 anna lordian 7/26/2023
我将在这里展示我的数据中的一个小样本和它所需的结果 df = pd。DataFrame(data={'set_1': [0.05, 0.05, 0.07, 0.15, 0.43, 0.2], 'set_2': [0.05, 0.05, 0.07, 0.15, 0.43, 0.2], 'set_3': [0.05, 0.05, 0.07, 0.15, 0.43, 0.2], 'set_4': [0.05, 0.05, 0.07, 0.15, 0.43, 0.2], 'set_5': [0.07, 0.07, 0.06, 0.1, 0.2, 0.3], 'set_6': [0.07, 0.07, 0.06, 0.1, 0.2, 0.3] }) 结果 sould be = [1,1,1,1,2,2]
0赞 anna lordian 7/27/2023 #2

大家好,感谢您的帮助。找到代码无法正常工作的原因。问题出在数据上。在句点后将它们四舍五入为两位数并将它们转换为字符串后,问题就解决了。