2017-06-12 13 views
2

インデックスが異なるが、一致するカラムを持つ2つのデータフレームを持つと、どうやってそれらの違いを計算できますか?異なるインデックスを持つ2つのデータフレームでのパンダの計算

df1 = pd.DataFrame({ 'a': (188, 750, 1330, 1385, 188, 750, 1330, 1385), 
        'b': (51.12, 51.45, 74.49, 29.21, 39.98, 3.98, 14.46, 16.51), 
        'c': pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F', 'F']) }) 
df1 = df1.set_index(['a']) 

      b c 
a    
188 51.12 R 
750 51.45 R 
1330 74.49 R 
1385 29.21 R 
188 39.98 F 
750 3.98 F 
1330 14.46 F 
1385 16.51 F 


df2 = pd.DataFrame({ 'x': (20, 50), 
        'c': pd.Categorical(['R', 'F']) }) 
df2 = df2.set_index(['c']) 

    x 
c  
R 20 
F 50 

と私は列df1cdf2にインデックスcと一致する必要があることを条件に基づいてdf2xdf1の列bの違いを利用したいと思いたとえば

、。

  b c diff 
a      
188 51.12 R 31.12 
750 51.45 R 31.45 
1330 74.49 R 54.49 
1385 29.21 R 9.21 
188 39.98 F -10.02 
750 3.98 F -46.02 
1330 14.46 F -35.54 
1385 16.51 F -33.49 

答えて

2

あなたはjoinまたはmapを使用することができます:

df1['diff'] = df1['b'] - df1.join(df2, on='c')['x'] 
print (df1) 
      b c diff 
a      
188 51.12 R 31.12 
750 51.45 R 31.45 
1330 74.49 R 54.49 
1385 29.21 R 9.21 
188 39.98 F -10.02 
750 3.98 F -46.02 
1330 14.46 F -35.54 
1385 16.51 F -33.49 

または:

df1['diff'] = df1['b'] - df1['c'].map(df2['x']) 
print (df1) 
      b c diff 
a      
188 51.12 R 31.12 
750 51.45 R 31.45 
1330 74.49 R 54.49 
1385 29.21 R 9.21 
188 39.98 F -10.02 
750 3.98 F -46.02 
1330 14.46 F -35.54 
1385 16.51 F -33.49 
+0

DF2はなく、データフレームのシリーズだった場合は、これらの方法は、例えば、シリーズで動作します。 SeriesをDataFrameに変換して列名を付けるのは簡単ですが、これをさらに明確にすることを求めています。 – PedroA

+1

はい、簡単です。各列は「シリーズ」です。 'df2 ['x']'は 'Series'です – jezrael

2
df1.assign(diff = df1['b'] - df1['c'].map(df2.squeeze())) 

出力:

結果は次のようなものになるだろう

  b c diff 
a      
188 51.12 R 31.12 
750 51.45 R 31.45 
1330 74.49 R 54.49 
1385 29.21 R 9.21 
188 39.98 F -10.02 
750 3.98 F -46.02 
1330 14.46 F -35.54 
1385 16.51 F -33.49 
1
df1["diff"] = df1.apply(lambda x: x.b - df2.loc[x.c].values[0],axis=1) 
関連する問題