2016-10-19 4 views
1

Ich habe zwei Datenfelder unterschiedlicher Länge beide nach Datum indexiert. Ich brauche beide Datenrahmen, um die gleichen Daten zu haben, dh. Löschen Sie die zusätzlichen Einträge im längsten Datenrahmen.Vergleichen Pandas Datenrahmen unterschiedlicher Länge

Ich habe festgestellt, dass ich Index zurücksetzen und es eine andere Spalte machen kann dann diese Spalte als Pandas Dataseries aufrufen und mit den anderen Datenserien vergleichen, mir eine Pandas-Serie mit nur den Einträgen geben, die auch im kürzeren Datenrahmen sind : ich würde müssen, um die Indexpositionen von diesen Werten und in einem weiteren Schritt löschen sie es aus der längsten Datenrahmen finden

df1 = ... 
df2 = ... 
dfadj = df1.reset_index(['Date']) 
dfstock = dfadj['Date'][dfadj['Date'].isin(dfindex['Date'])] 

Aber dann. Fehle ich eine völlig andere Annäherung, die logischer und/oder einfach wäre?

Antwort

3

können Sie verwenden Index.intersection und wählen Sie dann Daten in df2 von ix:

idx = df2.index.intersection(df1.index) 
print (idx) 
DatetimeIndex(['2015-02-24', '2015-02-25', '2015-02-26', '2015-02-27', 
       '2015-02-28', '2015-03-01', '2015-03-02', '2015-03-03', 
       '2015-03-04', '2015-03-05'], 
       dtype='datetime64[ns]', freq='D') 

print (df2.ix[idx]) 
      b 
2015-02-24 10 
2015-02-25 11 
2015-02-26 12 
2015-02-27 13 
2015-02-28 14 
2015-03-01 15 
2015-03-02 16 
2015-03-03 17 
2015-03-04 18 
2015-03-05 19 

Eine andere Lösung ist merge zu verwenden mit INNER JOIN, was durch deafult ist, kann so how='inner' omited werden:

df = pd.merge(df1,df2, left_index=True, right_index=True) 

Probe:

rng1 = pd.date_range(pd.to_datetime('2015-02-24'), periods=10) 
df1 = pd.DataFrame({'a': range(10)}, index=rng1) 
print (df1) 
      a 
2015-02-24 0 
2015-02-25 1 
2015-02-26 2 
2015-02-27 3 
2015-02-28 4 
2015-03-01 5 
2015-03-02 6 
2015-03-03 7 
2015-03-04 8 
2015-03-05 9 

rng2 = pd.date_range(pd.to_datetime('2015-02-24'), periods=20) 
df2 = pd.DataFrame({'b': range(10,30)}, index=rng2) 
print (df2) 
      b 
2015-02-24 10 
2015-02-25 11 
2015-02-26 12 
2015-02-27 13 
2015-02-28 14 
2015-03-01 15 
2015-03-02 16 
2015-03-03 17 
2015-03-04 18 
2015-03-05 19 
2015-03-06 20 
2015-03-07 21 
2015-03-08 22 
2015-03-09 23 
2015-03-10 24 
2015-03-11 25 
2015-03-12 26 
2015-03-13 27 
2015-03-14 28 
2015-03-15 29 
df = pd.merge(df1,df2, left_index=True, right_index=True) 
print (df) 
      a b 
2015-02-24 0 10 
2015-02-25 1 11 
2015-02-26 2 12 
2015-02-27 3 13 
2015-02-28 4 14 
2015-03-01 5 15 
2015-03-02 6 16 
2015-03-03 7 17 
2015-03-04 8 18 
2015-03-05 9 19 

Last bei Bedarf löscht einige Spalten verwenden drop:

print (df.drop(['a'], axis=1)) 
      b 
2015-02-24 10 
2015-02-25 11 
2015-02-26 12 
2015-02-27 13 
2015-02-28 14 
2015-03-01 15 
2015-03-02 16 
2015-03-03 17 
2015-03-04 18 
2015-03-05 19 
+0

Ich bin völlig vertraut mit der ix Funktion und suche es in der Anleitung oben habe mich nicht verstehen. – Simon

+0

(letzte Bemerkung versehentlich gepostet vor dem Abschluss). Die "Merge" -Funktion, die in Bezug auf beide Indizes gleichzeitig verwendet wird, scheint eine intuitive Lösung zu sein. Vielen Dank! – Simon

+0

Es stellt sich heraus, dass durch die Zusammenführung einige der Spaltennamen geändert werden - also auch, wenn ich 'drop' benutze, um neue Spalten zu entfernen, habe ich nicht die alten Spalten. Ich werde versuchen, mit der .ix-Funktion – Simon

Verwandte Themen