2014-12-31 3 views
14

Ich versuche ein (Pandas 14.1) Datenrahmen und eine Serie zu verschmelzen. Die Reihe sollte eine neue Spalte mit einigen NAs bilden (da die Indexwerte der Reihe eine Teilmenge der Indexwerte des Datenrahmens sind).Pandas concat: ValueError: Form der übergebenen Werte ist blah, Indizes implizieren blah2

Dies funktioniert für ein Spielzeug Beispiel, aber nicht mit meinen Daten (unten aufgeführt).

Beispiel:

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 

Die Situation mit den Daten (siehe unten) scheint im Grunde identisch - concatting eine Serie mit einem DatetimeIndex, deren Werte eine Teilmenge des Datenrahmen des. Aber es gibt den ValueError im Titel (blah1 = (5, 286) blah2 = (5, 276)). Warum funktioniert es nicht ?:

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

Haben Sie 'append' anstelle von' concat' probiert? Und wenn ich den 'ValueError' richtig verstehe, heißt das, dass es 286 Zeilen Daten gibt, aber die Indizes des Datenrahmens erwarten 276 Zeilen. Probieren Sie 'len (df.index)' und 'len (h1.index)' aus. –

+0

df.append (hl) schlägt mit TypeError fehl: Objekt 'NoneType' ist nicht iterierbar. Aber dann habe ich versucht mitzumachen - danke! :) – birone

+0

Kein Problem. Stellen Sie sicher, dass Sie Ihre Antwort als richtig markieren, damit SO-Benutzer Ihre Lösung schnell finden können, wenn sie ein ähnliches Problem haben. –

Antwort

2

Aus_lacy der Post gab mir die Idee zu versuchen, verwandte Verfahren, von denen beitreten funktioniert:

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 

Einige Einblick, warum Concat arbeitet am Beispiel aber diese Daten wären nicht schön!

25

Ich hatte ein ähnliches Problem (join gearbeitet, aber concat schlug fehl).

Prüfung auf doppelte Indexwerte in df1 und s1 (z df1.index.is_unique)

doppelte Indexwerte Entfernen (beispielsweise df.drop_duplicates(inplace=True)) oder eine der Methoden, die hier https://stackoverflow.com/a/34297689/7163376 sollte es lösen.

+2

Das hat funktioniert, danke! Ich mache das so: df = pd.concat ([df1, df2], axis = 1, join_axes = [df1.index]). Wenn ich in df2 düpte, dann bekomme ich diesen Fehler. Sinnvoll, da es nicht mehrere doppelte Indizes über beide DFs hinweg zuordnen kann. – sparrow

1

Mein Problem, wo verschiedene Indizes, der folgende Code mein Problem gelöst.

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

Ihre Indizes enthalten wahrscheinlich doppelte Werte.

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)) 
Verwandte Themen