Pandas 按用户阈值替换过大/过小rt值 解决Series对比报错
报错原因
你写的代码直接对两个索引、长度都不匹配的Series做逐元素比较,pandas要求参与比较的Series必须标签完全对齐,所以触发了ValueError: Can only compare identically-labeled Series objects。
正确实现方案
核心思路是先通过用户ID将两个表关联,让每条样本都带上对应用户的阈值和均值,再做逐行判断替换。
代码实现
import pandas as pd # 1. 关联全量数据表和用户阈值表,匹配对应用户的统计值 df_merged = df.merge( df_outliers_total[['Person ID', 'rt_mean', 'desvios_mayores', 'desvios_menores']], on='Person ID', how='left' ) # 2. 超出阈值的rt替换为对应用户均值 # 写法1:用where方法(条件为真保留原值,为假替换为均值) df_merged['rt'] = df_merged['rt'].where( (df_merged['rt'] >= df_merged['desvios_menores']) & (df_merged['rt'] <= df_merged['desvios_mayores']), df_merged['rt_mean'] ) # 写法2:用布尔索引(和上面效果一致,二选一即可) # mask = (df_merged['rt'] > df_merged['desvios_mayores']) | (df_merged['rt'] < df_merged['desvios_menores']) # df_merged.loc[mask, 'rt'] = df_merged.loc[mask, 'rt_mean'] # 3. 删掉不需要的阈值字段,得到最终结果 df_final = df_merged.drop(columns=['rt_mean', 'desvios_mayores', 'desvios_menores'])
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

