Python 检测几乎重复的行

Python 检测几乎重复的行,python,pandas,duplicates,Python,Pandas,Duplicates,假设我有一个表,其中包含日期和每个日期的值(加上其他列)。 我可以通过使用查找在同一天具有相同值的行 data.duplicated(subset=["VALUE", "DAY"], keep=False) 现在,假设我想让一天的值减少1或2,并且该值最多减少10,我该怎么做 例如: DAY MTH YYY VALUE NAME 22 9 2016 8.25 John 22 9 2016 43 John 6 11 2016 28.25

假设我有一个表,其中包含日期和每个日期的值(加上其他列)。 我可以通过使用查找在同一天具有相同值的行

data.duplicated(subset=["VALUE", "DAY"], keep=False)
现在,假设我想让一天的值减少1或2,并且该值最多减少10,我该怎么做

例如:

DAY MTH YYY VALUE   NAME
22  9   2016    8.25    John
22  9   2016    43      John
6   11  2016    28.25   Mary
2   10  2016    50  George
23  11  2016    90  George
23  10  2016    30  Jenn
24  8   2016    10  Mike
24  9   2016    10  Mike
24  10  2016    10  Mike
24  11  2016    10  Mike
13  9   2016    170 Kathie
13  10  2016    170 Kathie
13  11  2016    160 Kathie
8   9   2016    16  Gina
9   10  2016    16  Gina
8   11  2016    16  Gina
16  11  2016    25  Ross
21  11  2016    45  Ross
23  9   2016    50  Shari
23  10  2016    50  Shari
23  11  2016    50  Shari
使用上述代码,我可以找到:

DAY MTH YYY VALUE   NAME
24  8   2016    10  Mike
24  9   2016    10  Mike
24  10  2016    10  Mike
24  11  2016    10  Mike
23  9   2016    50  Shari
23  10  2016    50  Shari
23  11  2016    50  Shari
然而,我还想在8月8日、9月9日和10月8日检测Gina的值16,因为它们具有相同的值,虽然不是同一天,但只是休息一天

类似地,我想检测Kathie在9月13日、10月13日和11月13日的值,因为该值只差10

我如何才能做到这一点?

暴力强迫:

    df_data = df_data.sort_values(['DAY','VALUE'])
    df_data['Dup'] = False

    prev_row = pd.Series()
    prev_idx = None
    for idx, row in df_data.iterrows():
        if not prev_row.empty:
            if (abs(row['DAY'] - prev_row['DAY']) <=2) & \
               (abs(row['VALUE'] - prev_row['VALUE']) <=10):
                df_data['Dup'][idx] = True
                df_data['Dup'][prev_idx] = True
        prev_row, prev_idx  = row, idx

    print df_data

这是理想的结果吗?

使用
numpy
和三角形索引映射所有组合

day = df.DAY.values
val = df.VALUE.values

i, j = np.triu_indices(len(df), k=1)
c1 = np.abs(day[i] - day[j]) < 2
c2 = np.abs(val[i] - val[j]) < 10

c = c1 & c2
df.iloc[np.unique(np.append(i[c], j[c]))]

    DAY  MTH   YYY  VALUE    NAME
1    22    9  2016   43.0    John
6    24    8  2016   10.0    Mike
7    24    9  2016   10.0    Mike
8    24   10  2016   10.0    Mike
9    24   11  2016   10.0    Mike
10   13    9  2016  170.0  Kathie
11   13   10  2016  170.0  Kathie
13    8    9  2016   16.0    Gina
14    9   10  2016   16.0    Gina
15    8   11  2016   16.0    Gina
17   21   11  2016   45.0    Ross
18   23    9  2016   50.0   Shari
19   23   10  2016   50.0   Shari
20   23   11  2016   50.0   Shari
day=df.day.values
val=df.VALUE.values
i、 j=np.triu_指数(len(df),k=1)
c1=np.abs(日[i]-日[j])<2
c2=np.abs(val[i]-val[j])<10
c=c1和c2
df.iloc[np.unique(np.append(i[c],j[c]))]
日期MTH YYY值名称
1 22 9 2016 43.0 John
62482016 10.0迈克
7 24 9 2016 10.0迈克
8 24 10 2016 10.0迈克
9 24 11 2016 10.0 Mike
10 13 9 2016 170.0 Kathie
11 13 10 2016 170.0 Kathie
13 8 9 2016 16.0吉纳
14 9 10 2016 16.0吉纳
15 8 11 2016 16.0吉纳
17 21 11 2016 45.0罗斯
18 23 9 2016 50.0沙里
19 23 10 2016 50.0沙里
20 23 11 2016 50.0沙里

您突出显示的值将关闭一个月,而不是一天。你是说月份吗?这些值在连续月份的同一天,可以使用我使用的代码检测到。比如说,现在您希望它们连续几个月使用相同的值,但不一定是同一天(可能是休息一天)。我该怎么做?是的,这就是我想要的这似乎是一个很好的pythonic解决方案,它可以更好地适应其他条件。非常感谢。
day = df.DAY.values
val = df.VALUE.values

i, j = np.triu_indices(len(df), k=1)
c1 = np.abs(day[i] - day[j]) < 2
c2 = np.abs(val[i] - val[j]) < 10

c = c1 & c2
df.iloc[np.unique(np.append(i[c], j[c]))]

    DAY  MTH   YYY  VALUE    NAME
1    22    9  2016   43.0    John
6    24    8  2016   10.0    Mike
7    24    9  2016   10.0    Mike
8    24   10  2016   10.0    Mike
9    24   11  2016   10.0    Mike
10   13    9  2016  170.0  Kathie
11   13   10  2016  170.0  Kathie
13    8    9  2016   16.0    Gina
14    9   10  2016   16.0    Gina
15    8   11  2016   16.0    Gina
17   21   11  2016   45.0    Ross
18   23    9  2016   50.0   Shari
19   23   10  2016   50.0   Shari
20   23   11  2016   50.0   Shari