Pandas按Column1小于Column2条件交换两列,第4、5行未交换如何修复
问题原因
你编写的代码中str(df.Column1) < str(df.Column2)的写法存在逻辑错误:str(df.Column1)是将整个Column1列的Series对象整体转换为字符串,而非对列内的每个元素逐行做字符串转换,因此判断条件仅会返回1个全局布尔值,而非每行对应1个布尔值的数组,导致所有行统一触发交换逻辑,最终出现不符合预期的结果。
修复方案
步骤1:统一列数据类型为字符串
避免不同数据类型比较出现异常:
df['Column1'] = df['Column1'].astype(str) df['Column2'] = df['Column2'].astype(str)
步骤2:逐行比较并交换值
两种实现方式二选一即可:
方式1:通过布尔掩码实现(性能更高)
# 生成符合交换条件的行掩码 mask = df['Column1'] < df['Column2'] # 对符合条件的行交换两列值 df.loc[mask, ['Column1', 'Column2']] = df.loc[mask, ['Column2', 'Column1']].values
方式2:通过np.where实现
df['Column1'], df['Column2'] = np.where( df['Column1'] < df['Column2'], [df['Column2'], df['Column1']], [df['Column1'], df['Column2']] )
执行后结果
Column1 Column2 0 B A 1 F D 2 H C 3 J A 4 T G 5 Z A 6 Y S 7 V G 8 Y R 9 X T
第4行T > G、第5行Z > A均不满足交换条件,不会交换,符合预设规则。
内容的提问来源于stack exchange,提问作者surendra suri
相关产品推荐
相关产品推荐

