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)
append
anstattconcat
? Und wenn ich dasValueError
richtig verstehe , heißt es, dass es 286 Datenzeilen gibt, aber die Indizes des Datenrahmens erwarten 276 Zeilen. Versuchen Sie es mitlen(df.index)
undlen(h1.index)
.Antworten:
Ich hatte ein ähnliches Problem (
join
funktionierte, schlug aberconcat
fehl).Suchen Sie nach doppelten Indexwerten in
df1
unds1
, (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.quelle
df = df.loc[df.index.drop_duplicates()]
. Cf pandas.pydata.org/pandas-docs/stable/generated/...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)
quelle
inplace=True
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):quelle
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!
quelle
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))
quelle
Versuchen Sie, den Index nach dem Verketten zu sortieren
quelle
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.
quelle