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)

你可能感兴趣的:(Data,Analysis)