Tengo un archivo csv con dos columnas de a y b como se muestra a continuación:

a      b
601    1
602    2
603    3
604    4
605    5
606    6

Quiero leer y guardar datos en un nuevo archivo csv como se muestra a continuación:

s    id
601  1
602  1
603  1
604  2
605  2
606  2

He probado este código:

data=pd.read_csv('./dataset/test4.csv')
list=[]
i=0
while(i<6):
    list.append(data['a'].iloc[i:i+3])
    i+=3
df = pd.DataFrame(list)
print(df)

Por esto puesto:

       0      1      2      3      4      5
a  601.0  602.0  603.0    NaN    NaN    NaN
a    NaN    NaN    NaN  604.0  605.0  606.0

Primero necesito guardar la lista en un marco de datos con el siguiente resultado:

  0         1      2      3      4      5
  601.0  602.0  603.0    604.0  605.0  606.0

Y luego guardar en un archivo csv. Sin embargo, me quedé atrapado en la primera parte.

Gracias por tu ayuda.

1
Elham 30 oct. 2017 a las 23:57

3 respuestas

La mejor respuesta

Suponiendo que cada 3 elementos en a constituyan un grupo en b, solo haga una pequeña división entera en el índice.

data['b'] = (data.index // 3 + 1)

data

     a  b
0  601  1
1  602  1
2  603  1
3  604  2
4  605  2
5  606  2

Guardar en CSV es sencillo: todo lo que tiene que hacer es llamar a df.to_csv(...).


La división por índice está bien siempre que tenga un índice entero que aumente monotónicamente. De lo contrario, puede usar np.arange (por recomendación de MaxU):

data['b'] = np.arange(len(data)) // 3 + 1

data

     a  b
0  601  1
1  602  1
2  603  1
3  604  2
4  605  2
5  606  2
3
cs95 30 oct. 2017 a las 21:13
In [45]: df[['a']].T
Out[45]:
     0    1    2    3    4    5
a  601  602  603  604  605  606

O

In [39]: df.set_index('b').T.rename_axis(None, axis=1)
Out[39]:
     1    2    3    4    5    6
a  601  602  603  604  605  606
3
MaxU 30 oct. 2017 a las 21:05

Al usar su salida

df.stack().unstack()
Out[115]: 
       0      1      2      3      4      5
a  601.0  602.0  603.0  604.0  605.0  606.0

Entrada de datos

df
       0      1      2      3      4      5
a  601.0  602.0  603.0    NaN    NaN    NaN
a    NaN    NaN    NaN  604.0  605.0  606.0
3
YOBEN_S 30 oct. 2017 a las 21:02