2017-03-01 2 views
3

私はDataFrame dfを持っており、そこからdf2を減算したいと考えています。異なるサイズの2つのデータフレームを減算しますが、少なくとも最初のデータフレームのサイズを維持してください

dfが同じサイズを維持し、dfのすべての要素に対してマイナスdf2(df2にそのような一意のインデックス/列がない場合)を指定すると、ちょうどdf(i,j) - 0 df2でそのような索引/列は見つかりません)。

例:

DF:

Date Blue Dog Apple 
1/1/2016 3 4 2 
1/1/2015 3 4 2 
1/1/2014 3 4 2 
1/1/2013 3 4 2 
1/1/2013 3 4 2 
1/1/2013 3 4 2 

DF2:

Date Apple Blue Cat 
1/1/2017 1 3 2 
1/1/2016 1 3 2 
1/1/2015 1 3 2 
1/1/2014 1 3 2 

私はDFをしたい - このように見えるようにDF2:

Date Blue Dog Apple 
1/1/2016 0 4 1 
1/1/2015 0 4 1 
1/1/2014 0 4 1 
1/1/2013 3 4 2 
1/1/2012 3 4 2 
1/1/2011 3 4 2 

ありがとうございます。

答えて

4

バックフィルギャップ:

(df-df2).combine_first(df).reindex_like(df).astype(int) 
Out[45]: 
      Blue Dog Apple 
Date      
1/1/2016  0 4  1 
1/1/2015  0 4  1 
1/1/2014  0 4  1 
1/1/2013  3 4  2 
1/1/2012  3 4  2 
1/1/2011  3 4  2 
2

Boudがすでに偉大な答えで覆われて、それのオフに便乗しているが、あなたはまた、単にdf.subtract、その後reindex_likeに0のフィル値を提供することができます。

>>> df.subtract(df2, fill_value=0).reindex_like(df).astype(int) 
      Blue Dog Apple 
Date      
1/1/2016  0 4  1 
1/1/2015  0 4  1 
1/1/2014  0 4  1 
1/1/2013  3 4  2 
1/1/2012  3 4  2 
1/1/2011  3 4  2 

それはより速く(ラフ)ベンチマークから、我々はcombine_first組み合わせを避けることができるようであるようにこれが見えます。

%timeit df.subtract(df2, fill_value=0).reindex_like(df).astype(int) 
100 loops, best of 3: 3.63 ms per loop 

%timeit (df-df2).combine_first(df).reindex_like(df).astype(int) 
100 loops, best of 3: 8.69 ms per loop
関連する問題