如何依据重复行判定条件与aa列数值对比更新表格Keep标识列
问题排查与修复方案
核心问题根因
你遇到的df.at取值正确但.values取到旧值的问题,是pandas的.values属性的固有特性导致的:.values返回的是DataFrame底层数组的引用,当你通过.loc修改单个单元格值时,若pandas触发了副本写机制(Copy-on-Write),修改会作用在副本上,而原底层数组不会更新,因此.values取到的还是初始化Keep列时的全1数组。
另外你代码中还有两个隐性问题:
fmtlist定义了7个格式符,但你写入的a数组只有6列,格式符数量不匹配会导致写入时出现错位异常- 当前的重复行匹配逻辑仅支持两两重复的场景,若存在3行及以上的重复组,会出现Keep值被反复覆盖的错误
直接修复方案
修改循环内的取值逻辑,不再从.values取Keep列,直接用你刚计算的Keep值构造输出数组,彻底规避缓存不一致问题:
for i0,i1,d in dup_dict: aa0 = df['aa'].values[i0] aa1 = df['aa'].values[i1] # 先计算好Keep值,后续直接复用 if aa0 > aa1: k0, k1 = 1, 0 else: k0, k1 = 0, 1 df.loc[i0,'Keep'] = k0 df.loc[i1,'Keep'] = k1 # 只取前5列从df取值,最后一列Keep直接用已计算的k0、k1 a = df[['A','B','C','D','aa']].values[[i0,i1],:] a = np.column_stack([a, [k0, k1]]) # 同步修改fmtlist为6个格式符,和列数匹配 fmtlist = ['%s','%0.5f','%0.5f','%0.5f','%0.5f','%d'] np.savetxt(fl,a,fmt=fmtlist,delimiter=',')
更优实现方案
不用自己写循环匹配重复行,直接用pandas分组逻辑实现需求,支持任意长度的重复组,代码更简洁高效:
# 按A、B、C、D四列分组,每组内仅aa值最大的行Keep设为1,其余设为0 df['Keep'] = df.groupby(['A','B','C','D'])['aa'].transform(lambda x: (x == x.max()).astype(int))
内容的提问来源于stack exchange,提问作者Celeste Wilson
相关产品推荐
相关产品推荐

