2014-12-31 16 views
14

Sto provando a unire un dataframe (Pandas 14.1) e una serie. La serie dovrebbe formare una nuova colonna, con alcune NA (poiché i valori dell'indice della serie sono un sottoinsieme dei valori dell'indice del dataframe).Panda concat: ValueError: la forma dei valori passati è blah, gli indici implicano blah2

Questo funziona per un esempio di giocattolo, ma non con i miei dati (dettagli di seguito).

Esempio:

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 situazione con i dati (vedere sotto) sembra sostanzialmente identico - concatting una serie con un DatetimeIndex cui valori sono un sottoinsieme della dataframe del. Ma dà l'errore ValueError nel titolo (blah1 = (5, 286) blah2 = (5, 276)). Perché non funziona ?:

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) 
+2

Hai provato 'append' invece di' concat'? E se capisco il 'ValueError' correttamente sta dicendo che ci sono 286 righe di dati, ma gli indici del frame di dati si aspettano 276 righe. Prova a controllare 'len (df.index)' e 'len (h1.index)'. –

+0

df.append (hl) fallisce con TypeError: l'oggetto 'NoneType' non è iterabile. Ma poi ho provato ad unirmi - grazie! :) – birone

+0

Nessun problema. Assicurati di contrassegnare la risposta come corretta in modo che gli utenti SO di domani possano trovare rapidamente la soluzione se hanno un problema simile. –

risposta

2

post di Aus_lacy mi ha dato l'idea di metodi relativi cercano, di cui uniscono funziona:

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 

Alcuni visione per cui lavora concat sull'esempio ma non questi dati sarebbero comunque piacevoli!

25

Ho avuto un problema simile (join ha funzionato, ma concat non riuscito).

Verificare la presenza di valori di indice duplicati in df1 e s1, (per esempio df1.index.is_unique)

Rimozione valori di indice duplicati (per esempio, df.drop_duplicates(inplace=True)) oppure uno dei metodi qui https://stackoverflow.com/a/34297689/7163376 dovrebbe risolverlo.

+2

Ha funzionato grazie! Lo sto facendo in questo modo: df = pd.concat ([df1, df2], axis = 1, join_axes = [df1.index]). Se ho doppioni in df2, ho ricevuto questo errore. Ha senso perché non sa come mappare più indici duplicati su entrambi i DF. – sparrow

1

Il mio problema in cui diversi indici, il codice seguente risolto il mio problema.

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

Gli indici contengono probabilmente valori duplicati.

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)) 
Problemi correlati