Tengo los siguientes datos en un archivo CSV:

time   conc   time   conc   time    conc   time   conc
1:00    10    5:00   11     9:00    55     13:00   1
2:00    13    6:00   8      10:00   6      14:00   4 
3:00    9     7:00   7      11:00   8      15:00   3
4:00    8     8:00   1      12:00   11     16:00   8

Y solo quería fusionarlos como:

time   conc  
1:00   10
2:00   13
3:00   9
4:00   8
...
16:00  8

Tengo más de 1000 columnas, pero soy nuevo en pandas. Entonces, ¿me pregunto cómo puedo lograrlo?

0
CWWW 26 feb. 2021 a las 04:43

3 respuestas

La mejor respuesta

Un enfoque es cortar el marco de datos en porciones de dos columnas y luego volver a combinar usando pd.concat () después de cambiar el nombre. Primero cargue el marco de datos normalmente:

df = pd.read_csv('time_conc.csv')
df

Que se parece a lo que se muestra a continuación. Observe que pd.read_csv () ha agregado un sufijo a los nombres de columna duplicados:

    time    conc    time.1  conc.1  time.2  conc.2  time.3  conc.3
0   1:00    10      5:00    11      9:00    55      13:00   1
1   2:00    13      6:00    8       10:00   6       14:00   4
2   3:00    9       7:00    7       11:00   8       15:00   3
3   4:00    8       8:00    1       12:00   11      16:00   8

Luego corte usando pd.DataFrame.iloc:

total_columns = len(df.columns)
columns_per_set = 2

column_sets = [df.iloc[:,set_start:set_start + columns_per_set].copy() for set_start in range(0, total_columns, columns_per_set)]

column_sets es ahora una lista que contiene cada par de columnas duplicadas como un marco de datos independiente. A continuación, recorra la lista para cambiar el nombre de las columnas al original:

for s in column_sets:
    s.columns = ['time', 'conc']

Esto modifica cada marco de datos de dos columnas en su lugar para que los nombres de sus columnas coincidan. Finalmente, use pd.concat () para combinarlos haciendo coincidir el eje de la columna:

new_df = pd.concat(column_sets, axis=0, sort=False)
new_df

Lo que le da las dos columnas completas:

    time    conc
0   1:00    10
1   2:00    13
2   3:00    9
3   4:00    8
0   5:00    11
1   6:00    8
2   7:00    7
3   8:00    1
0   9:00    55
1   10:00   6
2   11:00   8
3   12:00   11
0   13:00   1
1   14:00   4
2   15:00   3
3   16:00   8
0
urbanplusdata 26 feb. 2021 a las 02:54

Dado que su archivo tiene nombres de columna duplicados, Pandas agregará sufijos. El encabezado del DataFrame por defecto será como ['tiempo', 'conc', 'time.1', 'conc.1', 'time.2', 'conc.2', 'time.3', 'conc. 3 '...]

Suponiendo que el separador de su archivo CSV es una coma:

import pandas as pd
df = pd.read_csv('/path/to/your/file.csv', sep=',')
total_n = len(df.columns)

lst = []
for x in range(int(total_n / 2 )):
    if x == 0:
        cols = ['time', 'conc']
    else:
        cols = ['time'+'.'+str(x), 'conc'+'.'+str(x)]
    df_sub = df[cols]  #Slice two columns each time
    df_sub.columns = ['time', 'conc']  #Slices should have the same column names
    lst.append(df_sub)
df = pd.concat(lst)  #Concatenate all the objects
0
Jackman Li 26 feb. 2021 a las 02:55

Suponiendo que df es un DataFrame con los datos del archivo csv, puede intentar lo siguiente:

# rename columns if needed
df.columns = ["time", "conc"]*(df.shape[1]//2)
# concatenate pairs of adjacent columns
pd.concat([df.iloc[:, [i, i+1]] for i in range(0, df.shape[1], 2)])

Da:

     time conc
0    1:00  10
1    2:00  13
2    3:00   9
3    4:00   8
0    5:00  11
..    ...  ..
3   12:00  11
0   13:00   1
1   14:00   4
2   15:00   3
3   16:00   8
0
bb1 26 feb. 2021 a las 03:19