2016-10-19 1 views
1

J'ai deux bases de données de longueurs différentes, toutes deux indexées par date. J'ai besoin des deux dataframes pour avoir les mêmes dates, ie. supprimer les entrées supplémentaires dans la plus longue trame de données.Comparaison des données Panda de différentes longueurs

J'ai trouvé que je peux réinitialiser l'index et en faire une autre colonne puis appeler cette colonne comme datas pandas et la comparer aux autres séries de données, me donnant une série de pandas avec seulement les entrées qui sont aussi dans la plus courte :

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

Mais je aurais besoin de trouver les positions d'index de ces valeurs et dans une autre étape le supprimer de la plus longue trame de données. Ai-je manqué une approche complètement différente qui serait plus logique et/ou simple?

Répondre

3

Vous pouvez utiliser Index.intersection puis sélectionnez les données dans df2 par 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 

Une autre solution est d'utiliser merge avec jointure interne, ce qui est par deafult, peut donc être entendue rectifier how='inner':

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

Échantillon:

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 

Dernière besoin supprimer si certaines colonnes utilisent 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

Je suis tout à fait familier avec la fonction ix et en regardant vers le haut dans le manuel ne m'a pas fait comprendre. – Simon

+0

(posté dernier commentaire par accident avant de finir). La fonction 'fusionner' utilisée par rapport aux deux index en même temps semble être une solution intuitive. Merci! – Simon

+0

Il s'avère qu'en utilisant la fusion certains noms de colonnes sont changés - donc même en utilisant 'drop' pour supprimer de nouvelles colonnes, je n'ai pas les anciennes. Je vais essayer d'utiliser la fonction .ix – Simon