Pandas concat: ValueError: la forma de los valores pasados ​​es bla, los índices implican blah2

Estoy tratando de fusionar un dataframe (Pandas 14.1) y una serie. La serie debe formar una nueva columna, con algunos NA (ya que los valores de índice de la serie son un subconjunto de los valores de índice del dataframe).

Esto funciona para un ejemplo de juguete, pero no con mis datos (se detalla a continuación).

Ejemplo:

import pandas as pd import numpy as np df1 = pd.DataFrame(np.random.randn(6, 4), columns=['A', 'B', 'C', 'D'], index=pd.date_range('1/1/2011', periods=6, freq='D')) df1 ABCD 2011-01-01 -0.487926 0.439190 0.194810 0.333896 2011-01-02 1.708024 0.237587 -0.958100 1.418285 2011-01-03 -1.228805 1.266068 -1.755050 -1.476395 2011-01-04 -0.554705 1.342504 0.245934 0.955521 2011-01-05 -0.351260 -0.798270 0.820535 -0.597322 2011-01-06 0.132924 0.501027 -1.139487 1.107873 s1 = pd.Series(np.random.randn(3), name='foo', index=pd.date_range('1/1/2011', periods=3, freq='2D')) s1 2011-01-01 -1.660578 2011-01-03 -0.209688 2011-01-05 0.546146 Freq: 2D, Name: foo, dtype: float64 pd.concat([df1, s1],axis=1) ABCD foo 2011-01-01 -0.487926 0.439190 0.194810 0.333896 -1.660578 2011-01-02 1.708024 0.237587 -0.958100 1.418285 NaN 2011-01-03 -1.228805 1.266068 -1.755050 -1.476395 -0.209688 2011-01-04 -0.554705 1.342504 0.245934 0.955521 NaN 2011-01-05 -0.351260 -0.798270 0.820535 -0.597322 0.546146 2011-01-06 0.132924 0.501027 -1.139487 1.107873 NaN 

La situación con los datos (ver a continuación) parece básicamente idéntica: concatear una serie con un IndiceIndex de tiempo cuyos valores son un subconjunto de los marcos de datos. Pero da el ValueError en el título (blah1 = (5, 286) blah2 = (5, 276)). ¿Por qué no funciona ?:

 In[187]: df.head() Out[188]: high low loc_h loc_l time 2014-01-01 17:00:00 1.376235 1.375945 1.376235 1.375945 2014-01-01 17:01:00 1.376005 1.375775 NaN NaN 2014-01-01 17:02:00 1.375795 1.375445 NaN 1.375445 2014-01-01 17:03:00 1.375625 1.375515 NaN NaN 2014-01-01 17:04:00 1.375585 1.375585 NaN NaN In [186]: df.index Out[186]:  [2014-01-01 17:00:00, ..., 2014-01-01 21:30:00] Length: 271, Freq: None, Timezone: None In [189]: hl.head() Out[189]: 2014-01-01 17:00:00 1.376090 2014-01-01 17:02:00 1.375445 2014-01-01 17:05:00 1.376195 2014-01-01 17:10:00 1.375385 2014-01-01 17:12:00 1.376115 dtype: float64 In [187]:hl.index Out[187]:  [2014-01-01 17:00:00, ..., 2014-01-01 21:30:00] Length: 89, Freq: None, Timezone: None In: pd.concat([df, hl], axis=1) Out: [stack trace] ValueError: Shape of passed values is (5, 286), indices imply (5, 276) 

Tuve un problema similar (la join funcionó, pero el concat falló).

Compruebe si hay valores de índice duplicados en df1 y s1 , (por ejemplo, df1.index.is_unique)

La eliminación de valores de índice duplicados (por ejemplo, df.drop_duplicates(inplace=True) ) o uno de los métodos aquí https://stackoverflow.com/a/34297689/7163376 debería resolverlo.

Mi problema donde diferentes índices, el siguiente código resolvió mi problema.

 df1.reset_index(drop=True, inplace=True) df2.reset_index(drop=True, inplace=True) df = pd.concat([df1, df2], axis=1) 

La publicación de Aus_lacy me dio la idea de probar métodos relacionados, de los cuales la combinación funciona:

 In [196]: hl.name = 'hl' Out[196]: 'hl' In [199]: df.join(hl).head(4) Out[199]: high low loc_h loc_l hl 2014-01-01 17:00:00 1.376235 1.375945 1.376235 1.375945 1.376090 2014-01-01 17:01:00 1.376005 1.375775 NaN NaN NaN 2014-01-01 17:02:00 1.375795 1.375445 NaN 1.375445 1.375445 2014-01-01 17:03:00 1.375625 1.375515 NaN NaN NaN 

¡Una idea de por qué Concat funciona en el ejemplo pero no esta información sería agradable!

Sus índices probablemente contienen valores duplicados.

 import pandas as pd T1_INDEX = [ 0, 1, # <= !!! if I write eg: "0" here then it fails 0.2, ] T1_COLUMNS = [ 'A', 'B', 'C', 'D' ] T1 = [ [1.0, 1.1, 1.2, 1.3], [2.0, 2.1, 2.2, 2.3], [3.0, 3.1, 3.2, 3.3], ] T2_INDEX = [ 1.2, 2.11, ] T2_COLUMNS = [ 'D', 'E', 'F', ] T2 = [ [54.0, 5324.1, 3234.2], [55.0, 14.5324, 2324.2], # [3.0, 3.1, 3.2], ] df1 = pd.DataFrame(T1, columns=T1_COLUMNS, index=T1_INDEX) df2 = pd.DataFrame(T2, columns=T2_COLUMNS, index=T2_INDEX) print(pd.concat([pd.DataFrame({})] + [df2, df1], axis=1)) 

Intenta clasificar el índice después de concatenarlos.

 result=pd.concat([df1,df2]).sort_index() 

To drop duplicate indices, use df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated/… – BallpointBen Apr 18 at 15:25

Esto está mal, pero no puedo responder directamente al comentario de BallpointBen debido a la baja reputación. La razón por la que no es correcto es que df.index.drop_duplicates() devuelve una lista de índices únicos, pero cuando se indexa nuevamente en el dataframe utilizando esos índices únicos, todavía devuelve todos los registros. Creo que esto es probable porque la indexación utilizando uno de los índices duplicados devolverá todas las instancias del índice.

En su lugar, use df.index.duplicated() , que devuelve una lista booleana (agregue el ~ para obtener los registros no duplicados):

df = df.loc[~df.index.duplicated()] .