Concatenar filas de dos marcos de datos en pandas
Necesito concatenar dos marcos de datos df_a
y df_b
que tengan el mismo número de filas ( nRow
) horizontalmente sin ninguna consideración de claves. Esta función es similar a cbind
la del lenguaje de programación R. El número de columnas en cada marco de datos puede ser diferente.
El marco de datos resultante tendrá el mismo número de filas nRow
y el mismo número de columnas que la suma del número de columnas en ambos marcos de datos. En otras palabras, se trata de una concatenación de columnas ciega de dos marcos de datos.
import pandas as pd
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'mz':[500.0, 500.5, 501.0]}
df_a = pd.DataFrame(dict_data)
dict_data = {'Treatment1': ['C', 'C', 'C'], 'Biorep1': ['A', 'A', 'A'], 'Techrep1': [1, 1, 1], 'AAseq1': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'inte1':[1100.0, 1050.0, 1010.0]}
df_b = pd.DataFrame(dict_data)
llame concat
y pase el parámetro axis=1
para concatenar en columnas:
In [5]:
pd.concat([df_a,df_b], axis=1)
Out[5]:
AAseq Biorep Techrep Treatment mz AAseq1 Biorep1 Techrep1 \
0 ELVISLIVES A 1 C 500.0 ELVISLIVES A 1
1 ELVISLIVES A 1 C 500.5 ELVISLIVES A 1
2 ELVISLIVES A 1 C 501.0 ELVISLIVES A 1
Treatment1 inte1
0 C 1100
1 C 1050
2 C 1010
Existe una guía útil sobre los distintos métodos de fusionar, unir y concatenar en línea.
Por ejemplo, como no tiene columnas que choquen, puede merge
usar los índices ya que tienen el mismo número de filas:
In [6]:
df_a.merge(df_b, left_index=True, right_index=True)
Out[6]:
AAseq Biorep Techrep Treatment mz AAseq1 Biorep1 Techrep1 \
0 ELVISLIVES A 1 C 500.0 ELVISLIVES A 1
1 ELVISLIVES A 1 C 500.5 ELVISLIVES A 1
2 ELVISLIVES A 1 C 501.0 ELVISLIVES A 1
Treatment1 inte1
0 C 1100
1 C 1050
2 C 1010
Y por las mismas razones anteriores, un simple join
también funciona:
In [7]:
df_a.join(df_b)
Out[7]:
AAseq Biorep Techrep Treatment mz AAseq1 Biorep1 Techrep1 \
0 ELVISLIVES A 1 C 500.0 ELVISLIVES A 1
1 ELVISLIVES A 1 C 500.5 ELVISLIVES A 1
2 ELVISLIVES A 1 C 501.0 ELVISLIVES A 1
Treatment1 inte1
0 C 1100
1 C 1050
2 C 1010
Gracias a @EdChum estaba luchando con el mismo problema, especialmente cuando los índices no coinciden. Desafortunadamente, en la guía de pandas se omite este caso (cuando, por ejemplo, elimina algunas filas)
import pandas as pd
t=pd.DataFrame()
t['a']=[1,2,3,4]
t=t.loc[t['a']>1] #now index starts from 1
u=pd.DataFrame()
u['b']=[1,2,3] #index starts from 0
#option 1
#keep index of t
u.index = t.index
#option 2
#index of t starts from 0
t.reset_index(drop=True, inplace=True)
#now concat will keep number of rows
r=pd.concat([t,u], axis=1)
Si las etiquetas de índice son diferentes (por ejemplo, si df_a.index == [0, 1, 2]
y df_b.index == [10, 20, 30]
son True
), un simple join
(o concat
o merge
) puede producir NaN filas. Un método útil en ese caso es set_axis()
obligar a los índices a ser iguales.
concatenated_df = df_a.join(df_b.set_axis(df_a.index))
# or
concatenated_df = pd.concat([df_a, df_b.set_axis(df_a.index)], axis=1)
Si la longitud de los fotogramas es la misma, también puede asignarlos df_b
a df_a
. A diferencia de concat
(o join
o merge
), esto altera df_a
y no crea un nuevo marco de datos.
df_a[df_b.columns] = df_b
# if index labels are different
df_a[df_b.columns] = df_b.set_axis(df_a.index)