Python: archivo CSV dividido según el primer carácter de la primera columna

Tengo una serie de archivos CSV grandes “basename.csv” como:

B1,3,5,6

B2,2,1,5

B3,1,9,0

C1,4,7,9

C2,1,9,3

C3,8,5,2

Me gustaría dividirlos en diferentes archivos como:

nombre_básico_B.csv

B1,3,5,6

B2,2,1,5

B3,1,9,0

nombre base_C.csv

C1,4,7,9

C2,1,9,3

C3,8,5,2

Ya he hecho cosas similares en el pasado con bucles y ifs, pero me preguntaba si existe una forma más eficiente de hacerlo con Pandas o lo que sea.

SOLUCIÓN

Adaptando la solución de @chthonicdaemon y @jezrael, se me ocurrió esto:

def split_csv(): for dfile in glob.glob('*.csv'): df = pd.read_csv(dfile, header=None) for letter, group in df.groupby(df[0].str[0]): group.to_csv((os.path.splitext(dfile)[0]) + '_{}.csv'.format(letter), index=False, header=False) split_csv() 

Aquí hay una aplicación simple de groupby :

 df = pandas.read_csv('basename.csv', header=None) def firstletter(index): firstentry = df.ix[index, 0] return firstentry[0] for letter, group in df.groupby(firstletter): group.to_csv('basename_{}.csv'.format(letter)) 

O bien, incorporando el uso de @ jezrael de la agrupación por el contenido explícito de las columnas:

 for letter, group in df.groupby(df[0].str[0]): group.to_csv('basename_{}.csv'.format(letter)) 

Creo que puedes crear MultiIndex y luego groupby por el primer nivel de índice y usar to_csv :

 import pandas as pd from pandas.compat import StringIO temp=u"""B1,3,5,6 B2,2,1,5 B3,1,9,0 C1,4,7,9 C2,1,9,3 C3,8,5,2""" #after testing replace StringIO(temp) to filename df = pd.read_csv(StringIO(temp), header=None) print (df) 0 1 2 3 0 B1 3 5 6 1 B2 2 1 5 2 B3 1 9 0 3 C1 4 7 9 4 C2 1 9 3 5 C3 8 5 2 

Otra solución similar como otra respuesta:

 for letter, g in df.groupby([df.iloc[:, 0].str[0]]): #print (letter) #print (g) g.to_csv('basename_{}.csv'.format(letter)) 

Probé este código y debería cumplir con los requisitos de su solicitud. example.csv sería el archivo de entrada csv.

 with open ('example.csv') as f: r = f.readlines() for i in range(len(r)): row = r[i] letter = r[i].split(',')[0][0] filename = "basename_"+letter.upper()+".csv" with open(filename,'a') as f: f.write(row)