Python 熊猫-在最小三角形后的第一排加入

Python 熊猫-在最小三角形后的第一排加入,python,pandas,join,dataframe,merge,Python,Pandas,Join,Dataframe,Merge,我有以下两个数据帧 x = pd.DataFrame.from_dict({'val':['A', 'B', 'C', 'D'], 'time':[10, 15, 17, 18]}) time val 0 10 A 1 15 B 2 17 C 3 18 D y = pd.DataFrame.from_dict({'val':['x', 'y', 'z', 't'], 'time':[11, 12.1, 16, 22]}) time val 0

我有以下两个数据帧

x = pd.DataFrame.from_dict({'val':['A', 'B', 'C', 'D'], 'time':[10, 15, 17, 18]})
   time val
0    10   A
1    15   B
2    17   C
3    18   D

y = pd.DataFrame.from_dict({'val':['x', 'y', 'z', 't'], 'time':[11, 12.1, 16, 22]})
   time val
0  11.0   x
1  12.1   y
2  16.0   z
3  22.0   t
我想将x中的每一行连接到y中至少2秒后发生的第一行:

  time_x  val_x  time_y  val_y
0    10    A      12.1    y
1    15    B      22.0    t 
2    17    C      22.0    t 
3    18    D      22.0    t 

这可能会减慢大数据帧的速度,但您可以使用“应用”在x上创建一个新列,并在该列上进行连接:

x['ytime']=x.time.apply(lambda i: y.time[y.time>=i+2].min())
   time val  ytime
0    10   A   12.1
1    15   B   22.0
2    17   C   22.0
3    18   D   22.0

x.merge(y, how='left', left_on='ytime', right_on='time').drop('ytime', axis=1)
       time_x val_x  time_y val_y
0      10     A    12.1     y
1      15     B    22.0     t
2      17     C    22.0     t
3      18     D    22.0     t

这可能会减慢大数据帧的速度,但您可以使用“应用”在x上创建一个新列,并在该列上进行连接:

x['ytime']=x.time.apply(lambda i: y.time[y.time>=i+2].min())
   time val  ytime
0    10   A   12.1
1    15   B   22.0
2    17   C   22.0
3    18   D   22.0

x.merge(y, how='left', left_on='ytime', right_on='time').drop('ytime', axis=1)
       time_x val_x  time_y val_y
0      10     A    12.1     y
1      15     B    22.0     t
2      17     C    22.0     t
3      18     D    22.0     t

谢谢你,伊恩。一个小问题:你的解决方案是否完全依赖于x和y具有相同的长度,或者它们的指数具有可比性?不,一点也不。索引可以是完全任意的,每个数据帧可以是任意长度,甚至可以是0。只有x时间和y时间可以比较。我唯一要注意的是,如果y中没有下一个最大值,在这种情况下,所有内容仍将完整无误,但结果数据帧中的值将为NaN。谢谢Ian。一个小问题:你的解决方案是否完全依赖于x和y具有相同的长度,或者它们的指数具有可比性?不,一点也不。索引可以是完全任意的,每个数据帧可以是任意长度,甚至可以是0。只有x时间和y时间可以比较。我唯一要注意的是,如果y中没有下一个最大值,在这种情况下,所有内容仍将完整无误,但结果数据帧中的值将为NaN。