Recibo los siguientes datos con código:

import pandas as pd
df = {'ID': ['H1','H2','H3','H4','H5','H6'],
      'AA1': ['C','B','B','X','G','G'],
      'AA2': ['W','K','K','A','B','B'],
      'name':['n1','n2','n3','n4','n5','n6']
}

df = pd.DataFrame(df)
df.groupby('AA1').apply(lambda x:x.sort_values('name'))

La salida:

        AA1 AA2 ID  name
AA1                 
B   1   B   K   H2  n2
    2   B   K   H3  n3
C   0   C   W   H1  n1
G   4   G   B   H5  n5
    5   G   B   H6  n6
X   3   X   A   H4  n4

Cuando trato de to_csv perderá el primer índice AA1, espero poder generar el csv como el resultado groupby pero no el resultado de esta manera:

    AA1 AA2 ID  name
1   B   K   H2  n2
2   B   K   H3  n3
0   C   W   H1  n1
4   G   B   H5  n5
5   G   B   H6  n6
3   X   A   H4  n4

Quiero decir, cuando abro el archivo csv en excel ¡espero poder ver el formato como la salida en jupyter!

2
ileadall42 1 nov. 2017 a las 08:39

4 respuestas

La mejor respuesta

Puede ser que puedas probar esto:

df_result.to_excel("result.xlsx")

Y el nombre de índice "AA1" se mantendrá.

2
kingbase 1 nov. 2017 a las 05:47

Los formatos CSV tienen sus limitaciones. Uno de ellos es mantener información sobre múltiples índices. Deberá realizar un seguimiento y cargar juiciosamente sus datos. Aquí hay un ejemplo.

df

      AA1 AA2  ID name
AA1                   
B   1   B   K  H2   n2
    2   B   K  H3   n3
C   0   C   W  H1   n1
G   4   G   B  H5   n5
    5   G   B  H6   n6
X   3   X   A  H4   n4

df.to_csv('test.csv')

!cat test.csv
AA1,,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4

Así se guarda el CSV. Ahora, al cargarlo de nuevo, especifique index_col y el índice múltiple se cargará como antes.

(pd.read_csv('test.csv', index_col=[0, 1])
   .rename_axis(['AA1', None])
   .rename(columns=lambda x: x.split('.')[0]))

      AA1 AA2  ID name
AA1                   
B   1   B   K  H2   n2
    2   B   K  H3   n3
C   0   C   W  H1   n1
G   4   G   B  H5   n5
    5   G   B  H6   n6
X   3   X   A  H4   n4

Tenga en cuenta que los nombres de sus columnas se alteran al guardar y volver a cargar; esta es otra limitación de CSV.

Como se menciona en la otra respuesta, sería mejor guardar explícitamente con un index_label al llamar a to_csv para que no tenga que deshacer las columnas.

4
cs95 14 abr. 2019 a las 18:23

Además, no necesita usar .groupby con .sort_values; df.sort_values(['AA1','name']) esencialmente hace lo mismo. Por lo tanto, sugeriría lo siguiente, que no responde exactamente a su pregunta, pero podría ser una alternativa preferible:

df.sort_values(['AA1','name']).to_csv('test.csv', index = False)

index = False aquí le dice a los pandas que no escriban el índice en el csv (los números del 0 al 5, reordenados desde la clasificación). Si lo desea de todos modos, no pase index = False a .to_csv().

2
Ken Wei 1 nov. 2017 a las 06:08

Si desea la misma salida que antes: MultiIndex DataFrame, necesita el parámetro index_col para crear MultiIndex de la primera y segunda columna:

df = pd.read_cav(file, index_col=[0,1])

Mejor es especificar en el to_csv parámetro index_label para evitar índices duplicados y nombres de columnas - aquí AA1:

df.to_csv('a.csv', index_label=['a','b'])
a,b,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4


df = pd.read_csv('a.csv', index_col=[0,1])
print (df)
    AA1 AA2  ID name
a b                 
B 1   B   K  H2   n2
  2   B   K  H3   n3
C 0   C   W  H1   n1
G 4   G   B  H5   n5
  5   G   B  H6   n6
X 3   X   A  H4   n4

Debido a que, de forma predeterminada, obtiene Unnamed para todas las columnas sin nombres y para todas las columnas duplicadas se agregan .1, .2 para evitar duplicados:

df.to_csv('a.csv')
AA1,,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4

#create DataFrame without MultiIndex 
df = pd.read_csv('a.csv')
print (df)
  AA1  Unnamed: 1 AA1.1 AA2  ID name
0   B           1     B   K  H2   n2
1   B           2     B   K  H3   n3
2   C           0     C   W  H1   n1
3   G           4     G   B  H5   n5
4   G           5     G   B  H6   n6
5   X           3     X   A  H4   n4

#create DataFrame with Multiindex
df = pd.read_csv('a.csv', index_col=[0,1])
print (df)
               AA1.1 AA2  ID name
AA1 Unnamed: 1                   
B   1              B   K  H2   n2
    2              B   K  H3   n3
C   0              C   W  H1   n1
G   4              G   B  H5   n5
    5              G   B  H6   n6
X   3              X   A  H4   n4
2
jezrael 1 nov. 2017 a las 05:59