1. ホーム
  2. python

pandas DataFrameの2つのカラムを乗算して、結果を新しいカラムに追加したいのですが。

2023-12-01 04:21:53

質問

pandas Dataframe (orders_df) の2つの既存の列、Prices (株価) と Amount (在庫数量) を掛け合わせ、計算結果を 'Value' という新しい列に追加しようとしています。このコードを実行すると、いくつかの行は負の数であるべきなのに、なぜか 'Value' 列の下のすべての行は正の数になっています。DataFrame の Action 列の下には、'Sell' という文字列が 7 行、'Buy' という文字列が 7 行存在します。

for i in orders_df.Action:
 if i  == 'Sell':
  orders_df['Value'] = orders_df.Prices*orders_df.Amount
 elif i == 'Buy':
  orders_df['Value'] = -orders_df.Prices*orders_df.Amount)

何が間違っているのか、教えてください。

どのように解決するのですか?

Haydenの解答の簡潔さを犠牲にするならば、次のような方法もあります。

In [22]: orders_df['C'] = orders_df.Action.apply(
               lambda x: (1 if x == 'Sell' else -1))

In [23]: orders_df   # New column C represents the sign of the transaction
Out[23]:
   Prices  Amount Action  C
0       3      57   Sell  1
1      89      42   Sell  1
2      45      70    Buy -1
3       6      43   Sell  1
4      60      47   Sell  1
5      19      16    Buy -1
6      56      89   Sell  1
7       3      28    Buy -1
8      56      69   Sell  1
9      90      49    Buy -1

これで if ステートメントが不要になりました。使用している DataFrame.apply() を使えば for ループも削除しています。Haydenが指摘したように、ベクトル化されたオペレーションは常に高速です。

In [24]: orders_df['Value'] = orders_df.Prices * orders_df.Amount * orders_df.C

In [25]: orders_df   # The resulting dataframe
Out[25]:
   Prices  Amount Action  C  Value
0       3      57   Sell  1    171
1      89      42   Sell  1   3738
2      45      70    Buy -1  -3150
3       6      43   Sell  1    258
4      60      47   Sell  1   2820
5      19      16    Buy -1   -304
6      56      89   Sell  1   4984
7       3      28    Buy -1    -84
8      56      69   Sell  1   3864
9      90      49    Buy -1  -4410

この解決策は1行の代わりに2行のコードを必要としますが、少し読みやすくなっています。計算コストも似たようなものだと思われます。