def b_pct(df, p0):
    bval = df.b[df.dt == p0]
assert bval.size == 1, 'can have only one entry per timestamp'
bval = bval.values[0]
return (df.a < bval).sum() / len(df.a)

def trajectory_b_percentile(df, p0):
    percentile_df = pd.DataFrame([pd.Series([s, d, b_pct(g, p0)], index=[
        'src', 'dest', 'percentile']) for (s, d), g in df.groupby(('src',
        'dest'))])
return percentile_df
векторизовать значение процентиля столбца B столбца A (для групп)