Concatenar filas de dos marcos de datos en pandas

Resuelto user1140126 asked hace 9 años • 3 respuestas

Necesito concatenar dos marcos de datos df_ay df_bque tengan el mismo número de filas ( nRow) horizontalmente sin ninguna consideración de claves. Esta función es similar a cbindla 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 nRowy 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)
user1140126 avatar Jan 25 '15 17:01 user1140126
Aceptado

llame concaty pase el parámetro axis=1para 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 mergeusar 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 jointambié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  
EdChum avatar Jan 25 '2015 10:01 EdChum

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)
Yury Wallet avatar Jan 14 '2018 19:01 Yury Wallet

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 concato 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_ba df_a. A diferencia de concat(o joino merge), esto altera df_ay 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)
cottontail avatar Feb 14 '2023 00:02 cottontail