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)