2017-10-03 16 views
0
df_1 

product_name amount price 
    a   1  1 
    b   2  2 
    c   3  3 
    d   4  4 

df_2 
product_name amount 
    a   1  
    b   2 

ここは、パンダの2つのデータフレームのサンプルです。別の列の値に基づいて1つの列から減算する

は、私はそれがまたproduct_name列の値を... 0を達するamount 0とb製品になりますproduct_names aような製品でamountを減算したいです。

+0

減算コピー&ペーストする必要があります。 –

+0

あなたのdfをテキスト形式で投稿してください。画像は役に立ちません。 –

+0

また、この問題を解決するためにこれまでに試したことを投稿してください。 –

答えて

1

は、あなたが持っていると言うお時間を

THX

df_1

product_name | amount | price 
    a   1  1 
    b   2  2 
    c   3  3 
    d   4  4 

df_2

product_name | amount 
    a   1  
    b   2 

あなたがdf_1とdf_2の両方のための指標としてPRODUCT_NAMEを設定するset_indexを使用することができますfill_value = 0でsubtract()を使用して、presでない値を維持する両方のデータフレームに存在します。

df_1.set_index('product_name').subtract(df_2.set_index('product_name'), fill_value=0).reset_index() 

利回り

product_name | amount | price 
    a   0.0  1.0 
    b   0.0  2.0 
    c   3.0  3.0 
    d   4.0  4.0 

質問はdf.isinを使用してデータを活かしsubtracting two dataframes

+0

値を減算するだけでインデックスを設定する必要はありません。参照:https://stackoverflow.com/a/46536055/4909087 –

+0

@cᴏʟᴅsindexインデックスは、適切な位置合わせのために非常に必要です。 –

1

オプション1
と非常によく似ている上記のコード:

mask = a.product_name.isin(b.product_name) 
a.loc[mask, 'amount'] = 0 

a 
    product_name amount price 
0   a  0  1 
1   b  0  2 
2   c  3  3 
3   d  4  4 

オプション2
​​reindex + subtract。少しより堅牢、0に設定されていません:

b = b.set_index('product_name').reindex(a.product_name).fillna(0) 
a.amount -= b.amount.values 

a 
    product_name amount price 
0   a  0.0  1 
1   b  0.0  2 
2   c  3.0  3 
3   d  4.0  4 
+1

オプション1は非常に特殊なケースでのみ動作します。オプション2は素晴らしいです。 –

+0

@TedPetrouはい、正確です。最初のオプションは、ある仮定の下で機能します。そしてありがとう! –

+0

- 引算とsetindex()の一回の使用で、再インデックスで私の心を吹き飛ばしました。 –

0

あなたはまた、マージができ、その後、代わりに画像を掲示するの、あなたのコードを

df = df1.merge(df2,how='left',on='product_name',suffixes=('','R')) 
df.amount = df.amount - df.amountR.fillna(0) 

    product_name amount price amountR 
0   a  0.0  1  1.0 
1   b  0.0  2  2.0 
2   c  3.0  3  NaN 
3   d  4.0  4  NaN 
関連する問題