Las pandas dividen el dataframe en múltiples csv según el valor de la columna

Tengo una pregunta muy similar a esta, pero debo ir un paso más allá al guardar marcos de datos divididos en csv.

import pandas as pd import numpy as np import os df = pd.DataFrame({ 'CITY' : np.random.choice(['PHOENIX','ATLANTA','CHICAGO', 'MIAMI', 'DENVER'], 1000), 'DAY': np.random.choice(['Monday','Tuesday','Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 1000), 'TIME_BIN': np.random.randint(1, 86400, size=1000), 'COUNT': np.random.randint(1, 700, size=1000)}) df['TIME_BIN'] = pd.to_datetime(df['TIME_BIN'], unit='s').dt.round('10min').dt.strftime('%H:%M:%S') print(df) OUTPUT: CITY COUNT DAY TIME_BIN 0 ATLANTA 476 Thursday 12:20:00 1 PHOENIX 50 Saturday 15:40:00 2 MIAMI 250 Friday 08:20:00 3 CHICAGO 358 Monday 15:40:00 4 PHOENIX 217 Thursday 22:10:00 5 MIAMI 12 Thursday 21:40:00 6 DENVER 22 Friday 10:30:00 7 CHICAGO 645 Sunday 23:40:00 8 MIAMI 188 Sunday 08:40:00 

Quiero hacer un dataframe separado para cada ciudad y guardarlo como .csv. El siguiente código funciona, pero ¿cómo lo hago de manera python sin tener que declarar explícitamente cada ciudad? El conjunto de datos real tiene aproximadamente 20 ciudades, por lo que no quiero volver a agregar esto 20 veces. Creo que el código a continuación se puede hacer en 1-2 líneas usando un bucle for, pero no sé cómo se vería. Algo así como “para ciudad en df [‘CITY’]”

 df_phoenix = df[df['CITY'] == "PHOENIX"] df_atlanta = df[df['CITY'] == "ATLANTA"] df_chicago = df[df['CITY'] == "CHICAGO"] df_phoenix.to_csv(os.getcwd() + "/data_phoenix.csv") df_atlanta.to_csv(os.getcwd() + "/data_atlanta.csv") df_chicago.to_csv(os.getcwd() + "/data_chicago.csv") 

Creo que necesitas groupby con la función lambda personalizada o con loop:

 f = lambda x: x.to_csv(os.getcwd() + "/data_{}.csv".format(x.name.lower()), index=False) df.groupby('CITY').apply(f) 

 for i, x in df.groupby('CITY'): x.to_csv(os.getcwd() + "/data_{}.csv".format(i.lower()), index=False) 

EDITAR por comentario, gracias @Anton vBR:

 for i, x in df.groupby('CITY'): p = os.path.join(os.getcwd(), "data_{}.csv".format(i.lower())) x.to_csv(p, index=False)