Pandas如何检测DataFrame两列对角相等值并新增布尔标识列
实现方案
直接用numpy的循环移位函数就能实现,逻辑不依赖固定行数、不需要硬编码索引,后续行数增减、行顺序调整都能自动适配。
核心逻辑
你描述的对角匹配是循环斜向匹配规则:对于n行的两列数据,第i行的Column_1值,需要和第(i+1) % n行的Column_2值做相等判断(3行场景下i=2时刚好对应第0行,和你给出的column_1[2].eq(column_2[0])示例完全一致)。np.roll可以直接实现数组的循环移位,将Column_2整体左移1位(shift=-1),原首行的值会自动补到移位后的末行位置,移位后的数组每个位置i的值,刚好就是原数组(i+1) % n位置的值,直接和Column_1做等值判断即可得到布尔列。
实现代码
先确保依赖导入:
import pandas as pd import numpy as np
添加Diagonal列只需要一行通用代码,所有场景通用:
df['Diagonal'] = df['Column_1'] == np.roll(df['Column_2'], shift=-1) # 用eq写法效果完全一致 # df['Diagonal'] = df['Column_1'].eq(np.roll(df['Column_2'], shift=-1))
测试验证
用你提供的三组样例测试:
- df1测试结果
输出:data1={'Column_1':['BR','BR','AC'],'Column_2':['AC','LF','LF']} df1=pd.DataFrame(data1) df1['Diagonal'] = df1['Column_1'].eq(np.roll(df1['Column_2'], shift=-1)) print(df1)
第三行返回True,完全匹配你给出的示例规则。Column_1 Column_2 Diagonal 0 BR AC False 1 BR LF False 2 AC LF True - df2测试结果
输出:data2={'Column_1':['BR','AC','BR'],'Column_2':['AC','LF','LF']} df2=pd.DataFrame(data2) df2['Diagonal'] = df2['Column_1'].eq(np.roll(df2['Column_2'], shift=-1)) print(df2)Column_1 Column_2 Diagonal 0 BR AC False 1 AC LF False 2 BR LF False - df3测试结果
输出:data3={'Column_1':['AC','BR','BR'],'Column_2':['LF','LF','AC']} df3=pd.DataFrame(data3) df3['Diagonal'] = df3['Column_1'].eq(np.roll(df3['Column_2'], shift=-1)) print(df3)Column_1 Column_2 Diagonal 0 AC LF False 1 BR LF False 2 BR AC False
扩展性说明
不管后续把DataFrame扩展到4行、10行还是更多行,或是对行做排序、打乱、新增/删除操作,只要重新运行上述赋值代码,就会自动基于当前的行数和行顺序计算结果,不需要调整任何参数。
内容的提问来源于stack exchange,提问作者the phoenix
相关产品推荐
相关产品推荐

