2016-10-19 11 views
1

私は、長さの異なる2つのデータフレームを両方とも日付で索引付けしています。私は両方のデータフレームが同じ日付を持つ必要があります。最も長いデータフレームの余分なエントリを削除します。異なる長さのパンダのデータフレームを比較する

インデックスをリセットしてもう1つ別の列にしてから、その列をpandasデータとして呼び出し、他のデータ系列と比較すると、より短いデータフレームにも含まれるエントリのみのpandasシリーズが得られます。 :

しかし、私はこれらの値からインデックスの位置を見つけ、別のステップで最も長いデータフレームから削除する必要があります。より論理的かつ/またはシンプルな全く異なる承認を怠っていますか?

答えて

3

あなたはIndex.intersectionを使用して、ixdf2内のデータを選択することができます。

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 

別の解決策は、内部結合とmergeを使用するものdeafultであるので、how='inner'を属性を省略してもかまいませある。

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

サンプル:

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 

最終いくつかの列を削除する必要がある場合は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

私はIX機能と完全に不慣れだと、手動でそれを見ていることは、私はそれを理解しませんでした。 – Simon

+0

(仕上げの前に最後のコメントを偶然に投稿しました)。両方のインデックスに対して同時に使用される「マージ」機能は直感的な解決策のようです。ありがとう! – Simon

+0

mergeを使うと、いくつかの列名が変更されていることがわかります。新しい列を削除するために 'drop'を使用しても、古い列は削除されません。 .ix関数を使用してみます – Simon

関連する問題