Pandas DataFrame groupby superposición de intervalos de longitud variable

Estoy tratando de agrupar un DataFrame por 2 columnas (vea el ejemplo a continuación). Para la primera columna, quiero que cada valor pertenezca a un grupo. Para la segunda columna, quiero agrupar por intervalos superpuestos de tamaño desigual.

Mi entendimiento es que pd.cut () solo me permite agrupar por intervalos no superpuestos.

Aquí hay un ejemplo:

0 1 2 0 0 4 1721 1 0 5 2353 2 0 6 58 3 0 7 524 4 1 1 1934 5 1 2 1318 6 1 2 1307 7 1 2 301 8 1 2 502 9 1 3 996 10 1 3 32 

Agrupando por columnas 0 y 1 quiero:

 0 1 2 0 [4,5] [1721,2353] [5,6] [2353,58] [6,7] [58,524] 1 [1,2] [1934,1318,1307,301,502] [2,3] [1318,1307,301,502,996,32] 

Entonces tomaría la media o estándar de la columna 2. ¿Alguna sugerencia? Gracias !

Empezando con:

  gr1 gr2 val 0 0 4 1721 1 0 5 2353 2 0 6 58 3 0 7 524 4 1 1 1934 5 1 2 1318 6 1 2 1307 7 1 2 301 8 1 2 502 9 1 3 996 10 1 3 32 

Primero, crea bandejas de valores en gr2 :

 bounds = df.gr2.sort_values().unique() bins = list(zip(bounds[:-1], bounds[1:])) def overlapping_bins(x): return pd.Series([l for l in bins if l[0] <= x <= l[1]]) 

A continuación, asigne valores de valor a los bins :

 df = pd.concat([df, df.gr2.apply(overlapping_bins).stack().reset_index(1, drop=True)], axis=1).rename(columns={0: 'bins'}).drop('gr2', axis=1) 

Y luego .groupby() resultando bins :

 df.groupby(['gr1', 'bins']).val.apply(lambda x: x.tolist()) gr1 bins 0 (3, 4) [1721] (4, 5) [1721, 2353] (5, 6) [2353, 58] (6, 7) [58, 524] 1 (1, 2) [1934, 1318, 1307, 301, 502] (2, 3) [1318, 1307, 301, 502, 996, 32] (3, 4) [996, 32]