如何按列处理Pandas DataFrame:仅当列内1-8区间的值恰好出现2次时将其替换为500
Pandas:仅当列中1-8区间值恰好出现2次时替换为500
我来帮你搞定这个需求!核心思路是先定位出恰好有2个值落在1-8区间的列,再针对这些列精准替换符合条件的数值,其他列保持原样,这样就能避免你之前全列应用掩码的问题。
分步实现说明
计算每列的符合区间值数量
用apply结合between(1,8)判断每个元素是否在目标区间,再用sum()统计每列的符合数量:counts = df.apply(lambda col: col.between(1,8).sum())这一步会得到一个Series,索引是列名,值是对应列中1-8区间元素的个数。
筛选需要处理的目标列
从上述统计结果中,筛选出数量恰好为2的列:target_cols = counts[counts == 2].index.tolist()在你的示例中,这一步会得到
['c'],只有列c符合条件。对目标列执行替换操作
用loc锁定目标列,再用where方法替换符合区间的值:df.loc[:, target_cols] = df.loc[:, target_cols].apply( lambda col: col.where(~col.between(1,8), 500) )where的逻辑是:当第一个参数(~col.between(1,8),即不在区间内)为True时保留原值,否则替换为第二个参数500,完美匹配你的需求。
完整可运行代码
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame(data={'a':[0,9,12,10,11], 'b': [1,8,90,2,0], 'c': [0,5,3,10,18], 'd': [15,43,90,14,87]}) # 统计每列1-8区间的元素数量 counts = df.apply(lambda col: col.between(1,8).sum()) # 筛选需要处理的列 target_cols = counts[counts == 2].index.tolist() # 执行替换 df.loc[:, target_cols] = df.loc[:, target_cols].apply( lambda col: col.where(~col.between(1,8), 500) ) # 输出结果 print(df)
运行结果
a b c d 0 0 1 0 15 1 9 8 500 43 2 12 90 500 90 3 10 2 10 14 4 11 0 18 87
关于你之前尝试的问题说明
你之前直接对全列应用mask,没有先筛选出符合计数条件的列,所以会错误地处理所有列中符合区间的值。现在的方法先锁定目标列,再进行替换,就精准满足了“仅当列中符合区间的值恰好出现2次时才替换”的要求。
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

