You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:19:35