Muestra de datos de entrada: 101.csv (tengo archivos similares para diferentes ID, es decir, 102.csv, 209.csv, etc.)

ID  A       B
101 1561.5  4.117647059
101 1757    4.705882353
101 1812    7.692307692
101 2020.5  8.333333333
101 1569    5.833333333
101 1958.5  7
101 1657.5  6
101 823.5   7.142857143
101 1938.5  3.529411765
101 2123    4.705882353
101 747.5   4.761904762
101 1895    8.333333333
101 1806.5  6.111111111
101 1702    8.461538462
101 1332    7.142857143
101 1740.5  4.117647059
101 1832    6.25
101 1966.5  6.111111111

Hice un cubo y calculé la media con el siguiente código, lo que quiero hacer ahora es agregar una columna con ID, cada cubo debe estar en una columna diferente en el encabezado, tengo varios archivos csv, cada archivo contiene una ID diferente. Quiero que mi archivo de salida contenga el resultado para cada ID, es decir, todos los archivos csv en la carpeta.

bins = [650,1000,1350,1700,2050,2400,2750,3000]
a_bins = df.B.groupby(pd.cut(df['A'],bins))
a_bins = a_bins.agg([np.mean]) 

Resultado que estoy obteniendo actualmente para cada identificación

A   B
650-1000    7.647691597
1000-1350   7.55428538
1350-1700   8.420818076
1700-2050   7.105554845
2050-2400   5.29774235
2400-2750   6.442554031
2750-3100   5.397752428

Lo que necesito es

ID  650-1000    1000-1350   1350-1700   1700-2050   2050-2400   2400-2750   2750-3100
101 7.6476916   7.5542854   8.4208181   7.1055548   5.2977424   6.4425540   5.3977524 
102 7.6576916   6.4425540   8.4508181   7.1155548   7.5542854   6.4725540   5.4077524 
209 7.6876916   8.4208181   7.5542854   5.3977524   7.5542854   5.2977424   7.5542854 

0
Sahil Sharma 2 ene. 2020 a las 14:35

2 respuestas

La mejor respuesta
from pathlib import Path
files = Path(".").glob("1*.csv")
my_df_list = []
bins = [650,1000,1350,1700,2050,2400,2750,3000]
columns = ("650-1000","1000-1350","1350-1700","1700-2050","2050-2400","2400-2750","2750-3000")
for file in files:
    file_name = file.name
    file_id = file_name.replace("*.csv","")
    df = pd.read_csv(file_name)
    print(df.columns)
    bins = [650,1000,1350,1700,2050,2400,2750,3000]
    a_bins = df.B.groupby(pd.cut(df['A'],bins))
    a_bins = a_bins.agg([np.mean]).reset_index(drop=True)
    a_bins_df = a_bins.T.copy()
    a_bins_df.columns = columns
    a_bins_df.index = [file_id]
    my_df_list.append(a_bins_df)
df_total = pd.concat(my_df_list,axis=0)

Suponiendo que todos los archivos .csv estén en el mismo directorio, a continuación se mostrará el resultado, he copiado 1.csv como 2.csv para probar el script anterior

    650-1000    1000-1350   1350-1700   1700-2050   2050-2400   2400-2750   2750-3000
102 5.952381    7.142857    5.316993    6.422334    4.705882    NaN NaN
101 5.952381    7.142857    5.316993    6.422334    4.705882    NaN NaN
1
user3235357 3 ene. 2020 a las 07:14

Creo que quieres

bins = [650,1000,1350,1700,2050,2400,2750,3000]
a_bins = df.groupby([pd.cut(df['A'],bins), 'ID']).B
a_bins.agg('mean').reset_index().pivot(index='ID', columns='A', values='B')

Así obtendrás:

A    (650, 1000]  (1000, 1350]  ...  (2400, 2750]  (2750, 3000]
ID                              ...                            
101     5.952381      7.142857  ...           NaN           NaN
1
ignoring_gravity 2 ene. 2020 a las 11:41