如何在一个时间范围内按多列查找重复的行

问题描述

对于下面的示例数据框,我试图获取'fruit'和'animal'列具有相同值的行,并且 dateTime列的值的差不大不到10分钟,但我在最后一步上遇到了麻烦。 (有关更多详细信息,选定的行最终将进入单独的df,并从当前行中删除)。

df_test:

    dateTime                fruit   animal  number
1   08/01/2020 1:08:00 AM   apple   monkey  1
2   08/01/2020 1:05:00 AM   apple   monkey  4
3   08/01/2020 1:20:00 AM   apple   frog    3
4   08/01/2020 1:40:00 AM   pear    dog     1
5   08/01/2020 1:47:00 AM   apple   monkey  2

获取“水果”和“动物”都匹配的行,我尝试过:

duplicates_df = df_test[df_test.duplicated(['fruit','animal'])]

在将重复项放入重复项df中之后,我无法找到可以用来提取适用于有关dateTime的指定规则的方法方法解决此问题的方法是什么?

解决方法

我不确定这是否能回答您的问题

df.sort_values(by=['dateTime'],inplace=True)
cond = ((df[['fruit','animal']] == df[['fruit','animal']].shift()).all(axis=1)) & df.dateTime.diff().lt('10min')
df[~cond]
,

尝试一下

from datetime import timedelta
import itertools as itt

def processGroup(G):
    indexes = G.index.to_list()
    groups  = []
    for i1,i2 in itt.combinations(indexes,2):
        added=False
        if (max(df.dateTime[i1],df.dateTime[i2]) - min(df.dateTime[i1],df.dateTime[i2])).seconds/60 <= 20.0:
            for g in groups:
                if (i1 in g) and (i2 not in g):
                    g.append(i2)
                    added=True
                    break
                elif (i2 in g) and (i1 not in g):
                    g.append(i1)
                    added=True
                    break
                elif (i2 in g) and (i1 in g):
                    added=True
                    break
                    
            if not added:
                groups.append([i1,i2])
                
#     print(groups)
    
    G['Group'] = ''
    result = pd.DataFrame(columns=G.columns.to_list())
    for i,g in enumerate(groups):
        result = pd.concat([result,G.loc[g]])
        result.loc[g,'Group'] = (i+1)
    
    return result

RESULT = pd.DataFrame(columns=df.columns.to_list()+['Group'])

for i,g in df.groupby(['fruit','animal']):
#     print(g)
    RESULT = pd.concat([RESULT,processGroup(g)])
    
print(RESULT.set_index(['fruit','animal','Group']))