あなたはIndex.intersection
を使用して、ix
でdf2
内のデータを選択することができます。
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
私はIX機能と完全に不慣れだと、手動でそれを見ていることは、私はそれを理解しませんでした。 – Simon
(仕上げの前に最後のコメントを偶然に投稿しました)。両方のインデックスに対して同時に使用される「マージ」機能は直感的な解決策のようです。ありがとう! – Simon
mergeを使うと、いくつかの列名が変更されていることがわかります。新しい列を削除するために 'drop'を使用しても、古い列は削除されません。 .ix関数を使用してみます – Simon