Python 查找数据帧中时间在60秒内的所有行对

Python 查找数据帧中时间在60秒内的所有行对,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧: >>> df X Y 0 a 2021-02-26 06:30:00 1 b 2021-02-26 06:30:30 2 c 2021-02-26 06:30:45 3 d 2021-02-26 06:31:30 4 e 2021-02-26 06:31:50 我想找出Y在60秒内的所有X对 所以我想: a、 b a、 c b、 c b、 d c、 d d、 e 我知道我可以在数据上使用循环并进行比较,但我希望有

我有这样一个数据帧:

>>> df
   X         Y
0  a  2021-02-26 06:30:00
1  b  2021-02-26 06:30:30
2  c  2021-02-26 06:30:45
3  d  2021-02-26 06:31:30
4  e  2021-02-26 06:31:50
我想找出Y在60秒内的所有X对

所以我想:

a、 b

a、 c

b、 c

b、 d

c、 d

d、 e


我知道我可以在数据上使用循环并进行比较,但我希望有一种更优雅的方法来实现这一点,例如使用过滤器和grouper

很容易使用
。这里的merge\u asof
函数:

将熊猫作为pd导入
从io导入StringIO
数据=StringIO(
"""
xy
0A2021-02-2606:30:00
1B 2021-02-2606:30:30
2c2021-02-2606:30:45
三维2021-02-2606:31:30
4E 2021-02-2606:31:50
“.strip())
df=pd.read\U csv(数据,sep='')
df['Y']=pd.to_datetime(df['Y'])
pd.merge\u asof(df,df,on='Y',容差=pd.Timedelta('60 s'),允许精确匹配=False,方向='forward')

但是,正如您从输出中看到的,对于每个左侧条目,它将只匹配一个项目。由于您对非唯一匹配感兴趣,这是一个更复杂的挑战,需要形成所有潜在的值组合。

以下是我的答案,希望这有助于:

  • 将“X”列转换为索引:
  • 创建所有可能的组合并将其存储在另一个数据框中:
  • comb_list=list(组合(df.index.to_list(),2))
    df2=pd.数据帧(组合列表)
    df2.index=comb\u列表
    df2['Result']=df2.apply(lambda行:df.loc[row[1]]['Y']-df.loc[row[0]['Y'],axis=1)
    output=df2[df2['Result']尝试以下方法:

    将熊猫作为pd导入
    从io导入StringIO
    从日期时间导入时间增量
    数据=StringIO(
    """
    xy
    0A2021-02-2606:30:00
    1B 2021-02-2606:30:30
    2c2021-02-2606:30:45
    三维2021-02-2606:31:30
    4E 2021-02-2606:31:50
    """)
    df=pd.read\U csv(数据,sep='')
    df['Y']=pd.to_datetime(df['Y'])
    #为交叉联接添加键
    df['key']=0
    #交叉连接
    df=df.merge(df,on='key',后缀=('','u intermediate'))
    df[(df['Y_intermediate']>df['Y'])
    
    &(df['Y_intermediate']-df['Y']如果你担心时间的话,python一开始就不是那么快的语言。
    df =  pd.DataFrame({
            'X': [ 'a','b','c','d','e'],
            'Y' : [ '2021-02-26 06:30:00','2021-02-26 06:30:30','2021-02-26 06:30:45','2021-02-26 06:31:30', '2021-02-26 06:31:50'],
           })
    df["Y"]= pd.to_datetime(df["Y"])
    df.index = df['X'] 
    df = df.drop('X',axis=1)
    
    comb_list = list(combinations(df.index.to_list(),2))
    df2 = pd.DataFrame(comb_list)
    df2.index = comb_list
    df2['Result'] = df2.apply(lambda row : df.loc[row[1]]['Y'] - df.loc[row[0]]['Y'] , axis = 1 )
    output = df2[df2['Result'] <= pd.Timedelta(60,'S')].index.to_list()
    print(output)
    [('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd'), ('c', 'd'), ('d', 'e')]