Pandas concat: ValueError: Die Form der übergebenen Werte ist bla, Indizes implizieren bla2

77

Ich versuche, einen (Pandas 14.1) Datenrahmen und eine Serie zusammenzuführen. Die Reihe sollte eine neue Spalte mit einigen NAs bilden (da die Indexwerte der Reihe eine Teilmenge der Indexwerte des Datenrahmens sind).

Dies funktioniert für ein Spielzeugbeispiel, jedoch nicht für meine Daten (siehe unten).

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 zu sein - eine Reihe mit einem DatetimeIndex zu verknüpfen, dessen Werte eine Teilmenge der Datenrahmen sind. 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)
Birone
quelle
2
Hast du es versucht appendanstatt concat? Und wenn ich das ValueErrorrichtig verstehe , heißt es, dass es 286 Datenzeilen gibt, aber die Indizes des Datenrahmens erwarten 276 Zeilen. Versuchen Sie es mit len(df.index)und len(h1.index).
Alacy
df.append (hl) schlägt mit TypeError fehl: Das Objekt 'NoneType' ist nicht iterierbar. Aber dann habe ich versucht mitzumachen - danke! :)
Birone
Kein Problem. Stellen Sie sicher, dass Sie Ihre Antwort als richtig markieren, damit zukünftige SO-Benutzer Ihre Lösung schnell finden können, wenn sie ein ähnliches Problem haben.
Alacy
Wird tun ... wenn es mich lässt.
Birone
3
Die Fehlermeldung könnte viel hilfreicher sein, wie zum Beispiel zu sagen "Sie haben wahrscheinlich einige doppelte Indizes" ...
Wörter für den

Antworten:

71

Ich hatte ein ähnliches Problem ( joinfunktionierte, schlug aber concatfehl).

Suchen Sie nach doppelten Indexwerten in df1und s1, (z. B. df1.index.is_unique)

Das Entfernen doppelter Indexwerte (z. B. df.drop_duplicates(inplace=True)) oder einer der Methoden hier https://stackoverflow.com/a/34297689/7163376 sollte das Problem beheben.

lmart999
quelle
3
Das hat funktioniert, danke! Ich mache es so: df = pd.concat ([df1, df2], axis = 1, join_axes = [df1.index]). Wenn ich Dups in df2 habe, erhalte ich diesen Fehler. Sinnvoll, da es nicht weiß, wie mehrere doppelte Indizes auf beide DFs abgebildet werden.
Spatz
1
Verwenden Sie zum Löschen doppelter Indizes df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated/...
BallpointBen
1
Der Vorschlag, in beiden Indizes nach doppelten Indexwerten zu
suchen,
27

Mein Problem waren verschiedene Indizes, der folgende Code löste mein Problem.

df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat([df1, df2], axis=1)
fließen
quelle
2
Sie haben vergesseninplace=True
Alaa M.
4

Verwenden Sie zum Löschen doppelter Indizes df = df.loc[df.index.drop_duplicates()]. Vgl. Pandas.pydata.org/pandas-docs/stable/generated/… - BallpointBen 18. April um 15:25 Uhr

Dies ist falsch, aber ich kann aufgrund des schlechten Rufs nicht direkt auf den Kommentar von BallpointBen antworten. Der Grund dafür ist, dass df.index.drop_duplicates()eine Liste eindeutiger Indizes zurückgegeben wird. Wenn Sie jedoch mit diesen eindeutigen Indizes wieder in den Datenrahmen indizieren, werden weiterhin alle Datensätze zurückgegeben. Ich denke, dies ist wahrscheinlich, weil die Indizierung mit einem der duplizierten Indizes alle Instanzen des Index zurückgibt.

Verwenden Sie stattdessen use df.index.duplicated(), das eine boolesche Liste zurückgibt (fügen Sie die hinzu ~, um die nicht duplizierten Datensätze zu erhalten):

df = df.loc[~df.index.duplicated()]
Jeremy Matt
quelle
3

Aus_lacys Beitrag brachte mich auf die Idee, verwandte Methoden auszuprobieren, von denen join 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

Ein Einblick, warum concat an dem Beispiel funktioniert, aber nicht diese Daten, wäre schön!

Birone
quelle
3

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))
Károly Frendrich
quelle
1

Versuchen Sie, den Index nach dem Verketten zu sortieren

result=pd.concat([df1,df2]).sort_index()
jibran abbasi
quelle
-3

Ich habe Join and Append ausprobiert, aber keiner von ihnen hat funktioniert. Ich habe einen 'try: ..., außer: continue' um diesen Abschnitt meines Codes verwendet und es hat perfekt funktioniert.

Mmonwu Enugu-Ezike
quelle