用Python比较两个字段的值以找到相同值吗?

-2 投票
3 回答
49 浏览
提问于 2025-04-14 16:59

这是我的代码

import pandas as pd
data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]}
df1 = pd.DataFrame(data1)
df1['OUTPUT'] = df1.duplicated(subset=['A', 'B'], keep=False).map({True: 'OK', False: 'NG'})
print(df1)

但是输出的结果是这样,我并不想要这个

在这里输入图片描述

我想要的输出是这样的

在这里输入图片描述

更新:
抱歉,这是我的错误。A和B中的值是字符串,而不是数字。

3 个回答

1

看起来你想检查重复的行,而且不管顺序如何都要检查。你可以再添加一列,用来存储每一列的排序值,然后用这列来检查重复项,方法如下:

import pandas as pd
data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]}
df1 = pd.DataFrame(data1)

df1['Sorted'] = df1.apply(lambda row: tuple(sorted((row['A'], row['B']))), axis=1)

# Check for duplicates based on the 'Sorted' column 
df1['OUTPUT'] = df1.duplicated(subset=['Sorted'], keep=False).map({True: 'OK', False: 'NG'})

print(df1)
1
import pandas as pd
data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]}
df1 = pd.DataFrame(data1)
df1['sorted_values'] = df1.apply(lambda row: sorted([row['A'], row['B']]), axis=1)
df1['OUTPUT'] = df1.duplicated(subset='sorted_values', 
keep=False).map({True: 'OK', False: 'NG'})
df1.drop(columns='sorted_values', inplace=True)
print(df1)

这可能就是你在寻找的解决办法。

0

如果你需要比较一些值,但不在乎它们的顺序,可以使用 sortedfrozenset,在 DataFrame.apply 中使用:

df1['OUTPUT'] = (df1[['A', 'B']].apply(sorted, axis=1).duplicated(keep=False)
                                .map({True: 'OK', False: 'NG'}))
print(df1)
   A  B OUTPUT
0  1  2     OK
1  1  2     OK
2  2  3     NG
3  3  4     NG
4  4  4     OK
5  4  4     OK
6  2  1     OK
7  1  2     OK

或者可以使用 np.sort

df1['OUTPUT'] = (pd.DataFrame(np.sort(df1[['A', 'B']], axis=1), 
                              index=df1.index).duplicated(keep=False)
                                              .map({True: 'OK', False: 'NG'}))
print(df1)
   A  B OUTPUT
0  1  2     OK
1  1  2     OK
2  2  3     NG
3  3  4     NG
4  4  4     OK
5  4  4     OK
6  2  1     OK
7  1  2     OK

如果你需要比较当前行和上一行的值,而不考虑顺序,可以使用 Series.shift 来比较辅助的 Series 中的值:

s = df1[['A', 'B']].apply(sorted, axis=1)

df1['OUTPUT'] = (s.eq(s.shift()) | s.eq(s.shift(-1))).map({True: 'OK', False: 'NG'})
print(df1)
   A  B OUTPUT
0  1  2     OK
1  1  2     OK
2  2  3     NG
3  3  4     NG
4  4  4     OK
5  4  4     OK
6  2  1     OK
7  1  2     OK

撰写回答