Python DataFrame 字段中连续相同值定位查找

1、概述

        最近数据清洗,需要清除dataframe中每列中有死值(即字段中出现连续同样值的行数,继续出现认为可能数据有异常,例如如果数据连续出现3次相同的值即认为死值),做了一些测试。
        例如,dataframe的某字段序列值为:[2, 3, 3, 3, 4, 6, 6, 6, 6, 6, 7, 9, 10],连续的“3”和“6”值即判断为死值,找出其下标,即找到下标[1, 2, 3]、 [5, 6, 7, 8, 9]。

2、代码

def clean_dead_value(series, num_dead_thresh):
    """
    :param series: 目标dataframe某个序列值
    :param num_dead_thresh: 判断死值的阈值
    :return: 每个计算周期内需要删除的行数列表
    """
    slide_list = [series.index[0]]
    slide_list_all = []
    for i in range(series.index[0],series.index[-1]):
        j = i + 1
        diff = series[j] - series[i]
        if diff == 0:
            slide_list.append(j)
        else:
            slide_list.clear()
            slide_list.append(j)
        # print("slide_list:",slide_list)
        if len(slide_list) >= num_dead_thresh:
            target_list = slide_list.copy()
            slide_list_all.append(target_list)
    print("slide_list_all:",slide_list_all)
    index= []  # 将找到的满足条件的index合并
    # 因为可能有前后包含的情况,只保留最长序列
    for i in range(len(slide_list_all) - 1):
        if set(slide_list_all[i]) < set(slide_list_all[i + 1]):
            index.append(i)
    m = {i: element for i, element in enumerate(slide_list_all)}
    [m.pop(i) for i in index]
    # 将所有需要删除的行数合并
    # indexs_to_delete = []
    # for i in range(len(slide_list_all)):
    #     indexs_to_delete = list(set(indexs_to_delete).union(slide_list_all[i]))
    return list(m.values())

if __name__== "__main__":
    df = pd.DataFrame(np.array([2, 3, 3, 3, 4, 6, 6, 6, 6, 6, 7, 9, 10]).reshape(13, 1), columns=['val'])
    num_dead_thresh = 3
    series = df.iloc[:,0]  #仅作为示例,如果是多列,可以进行循环
    indexs_to_delelte = clean_dead_value(series, num_dead_thresh)
    print(indexs_to_delelte)
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南洲.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值