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行のコードを必要としますが、少し読みやすくなっています。計算コストも似たようなものだと思われます。
関連
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] 既存のDataFrameに新しい列を追加する方法は?
-
[解決済み] Pandas DataFrameの特定の列の値がNaNである行を削除する方法
-
[解決済み] PandasでDataFrameの行を列の値に基づいて削除する
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
-
[解決済み】Pandas DataFrameのより多くの列を見るために出力表示を拡大する方法は?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] if 節の終了方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?