python - functions - Pandas concat: ValueError: la forma de los valores pasados es bla, los índices implican blah2
python pandas download windows (5)
Estoy tratando de fusionar un marco de datos (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 marco de datos).
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
A B C D
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)
A B C D 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: concatting 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]:
<class ''pandas.tseries.index.DatetimeIndex''>
[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]:
<class ''pandas.tseries.index.DatetimeIndex''>
[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)
Intenta clasificar el índice después de concatenarlos
result=pd.concat([df1,df2]).sort_index()
La publicación de Aus_lacy me dio la idea de probar métodos relacionados, de los cuales la unió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!
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)
Sus índices probablemente contienen valores duplicados.
import pandas as pd
T1_INDEX = [
0,
1, # <= !!! if I write e.g.: "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))
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)
Eliminar valores de índice duplicados (por ejemplo, df.drop_duplicates(inplace=True)
) o uno de los métodos aquí https://.com/a/34297689/7163376 debería resolverlo.