用Python比较两个字段的值以找到相同值吗?
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
如果你需要比较一些值,但不在乎它们的顺序,可以使用 sorted
或 frozenset
,在 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