如何在Pandas中筛选并保存含重复非零有效值(出现次数≥2)的行
如何在Pandas中筛选并保存含重复非零有效值(出现次数≥2)的行
我来帮你搞定这个金融数据筛选的需求!你想要挑出那些**同一行里存在至少2个相同的非零数值(值>0)**的行,并且保留整行的所有数据对吧?结合你给的示例数据,我给你整理了具体的实现步骤和代码,直接就能用:
核心思路
我们需要对每一行做两个关键检查:
- 先过滤掉所有0值,只关注大于0的有效数值
- 统计这些有效数值的出现频率,只要有任何一个数值出现次数≥2,就保留这一行
具体实现代码
1. 构造示例数据(如果已读入DataFrame可跳过)
先把你提供的示例数据转换成Pandas DataFrame,方便后续测试:
import pandas as pd # 你的原始数据 data = [ ["5/7/2025 21:00", 0, 0, 0, 0, 0, 0, 0, 0], ["5/7/2025 21:15", 0, 0, 19598.8, 0, 19598.8, 0, 0, 0], ["5/7/2025 21:30", 0, 0, 0, 0, 0, 0, 0, 0], ["5/7/2025 21:45", 0, 0, 0, 19823.35, 0, 0, 0, 0], ["5/7/2025 22:00", 0, 0, 0, 0, 0, 0, 0, 0], ["5/7/2025 22:15", 0, 0, 0, 0, 0, 0, 0, 0], ["5/7/2025 22:30", 0, 0, 0, 19975.95, 0, 19975.95, 0, 19975.95], ["5/7/2025 23:45", 0, 0, 0, 0, 0, 0, 0, 0], ["5/8/2025 1:00", 0, 0, 19830.2, 0, 0, 0, 0, 0], ["5/8/2025 1:15", 0, 0, 0, 0, 0, 0, 0, 0], ["5/8/2025 1:30", 0, 0, 0, 0, 0, 0, 0, 0], ["5/8/2025 1:45", 0, 0, 0, 0, 0, 0, 0, 0] ] columns = ["A", "B", "C", "D", "E", "F", "G", "H", "I"] df = pd.DataFrame(data, columns=columns)
2. 定义行判断函数
这个函数会逐行检查是否符合你的筛选条件:
def has_duplicate_non_zero(row): # 第一步:过滤当前行的所有0值,只保留大于0的有效数 non_zero_vals = row[row > 0] # 如果有效数不足2个,直接排除(不可能有重复) if len(non_zero_vals) < 2: return False # 第二步:统计每个有效数的出现次数 value_counts = non_zero_vals.value_counts() # 第三步:检查是否有任何一个数出现了至少2次 return (value_counts >= 2).any()
3. 筛选并查看结果
把函数应用到每一行,就能得到你想要的筛选后的数据:
# 筛选符合条件的行 filtered_df = df[df.apply(has_duplicate_non_zero, axis=1)] # 打印结果,就是你期望的两行数据 print(filtered_df)
运行后输出的结果正好是你要的:
A B C D E F G H I 1 5/7/2025 21:15 0 0 0 19598.80 0 19598.80 0 0 0 6 5/7/2025 22:30 0 0 0 19975.95 0 19975.95 0 19975.95
大数据量优化方案
如果你的数据量特别大,apply方法可能会有点慢,你可以用更高效的向量化判断方式替换上面的函数:
def has_duplicate_non_zero_fast(row): non_zero_mask = row > 0 # 先检查有效数是否≥2 if non_zero_mask.sum() < 2: return False # 直接检查非零值中是否存在重复项 return row[non_zero_mask].duplicated(keep=False).any()
这个版本用duplicated方法直接检查重复,速度会比value_counts快不少,适合处理百万级别的数据集。
内容来源于stack exchange
相关产品推荐
相关产品推荐

