閲覧頂き、ありがとうございます。
pandasでのデータ加工に関して不明点があり、質問させて頂きます。
プログラミング初心者のため、知識不足でありますが、ご容赦頂けると幸いです。
実現したいこと
pythonのpandasを用いて、CSVデータより以下のデータフレームを作成しました。
(そのデータフレーム名は「s」とします。)
今回実現したいことは、以下の内容を条件式を用いて計算することです。
- 「item」が「SELL」の場合は、「volume」に「-1」を乗算する
- 「product_class」が「AA」の場合は、「volume」に「1/10」を乗算する
●現状データフレーム 「s」
trade_date | product_class | instrument_id | instrument | broker_code | broker_name | item | volume | |
---|---|---|---|---|---|---|---|---|
12 | 20220606 | A | 60018 | A 2206 | 11560 | G | SELL | 181.0 |
38 | 20220606 | A | 90018 | A 2209 | 11560 | G | SELL | 1.0 |
56 | 20220606 | AA | 60019 | AA 2206 | 11560 | G | SELL | 395.0 |
84 | 20220606 | B | 60005 | B 2206 | 11560 | G | SELL | 1895.0 |
103 | 20220606 | B | 90005 | B 2209 | 11560 | G | SELL | 1179.0 |
8282 | 20220531 | A | 60018 | A 2206 | 11560 | G | BUY | 153.0 |
56 | 20220606 | AA | 60019 | AA 2206 | 11560 | G | BUY | 395.0 |
8282 | 20220531 | A | 60018 | A 2206 | 11560 | G | SELL | 153.0 |
8305 | 20220531 | AA | 10019 | AA2206 | 11560 | G | SELL | 8129.0 |
8345 | 20220531 | B | 10005 | BB 2206 | 11560 | G | SELL | 5708.0 |
8638 | 20220531 | A | 60018 | A 2206 | 11560 | G | SELL | 556.0 |
8662 | 20220531 | B | 60005 | B 2206 | 11560 | G | SELL | 5862.0 |
9995 | 20220606 | A | 60018 | A 2206 | 11560 | G | SELL | 50.00 |
9996 | 20220606 | AA | 90018 | AA2209 | 11560 | G | BUY | 150.00 |
●変換したいデータの形式 「s_1」
trade_date | product_class | instrument_id | instrument | broker_code | broker_name | item | volume | |
---|---|---|---|---|---|---|---|---|
12 | 20220606 | A | 60018 | A 2206 | 11560 | G | SELL | -181.0 |
38 | 20220606 | A | 90018 | A 2209 | 11560 | G | SELL | -1.0 |
56 | 20220606 | AA | 60019 | AA 2206 | 11560 | G | SELL | -39.50 |
84 | 20220606 | B | 60005 | B 2206 | 11560 | G | SELL | -1895.0 |
103 | 20220606 | B | 90005 | B 2209 | 11560 | G | SELL | -1179.0 |
8282 | 20220531 | A | 60018 | A 2206 | 11560 | G | BUY | 153.0 |
56 | 20220606 | AA | 60019 | AA 2206 | 11560 | G | BUY | 39.50 |
8282 | 20220531 | A | 60018 | A 2206 | 11560 | G | SELL | -153.0 |
8305 | 20220531 | AA | 10019 | AA2206 | 11560 | G | SELL | -812.90 |
8345 | 20220531 | B | 10005 | BB 2206 | 11560 | G | SELL | -5708.0 |
8638 | 20220531 | A | 60018 | A 2206 | 11560 | G | SELL | -556.0 |
8662 | 20220531 | B | 60005 | B 2206 | 11560 | G | SELL | -5862.0 |
9995 | 20220606 | A | 60018 | A 2206 | 11560 | G | SELL | -50.0 |
9996 | 20220606 | AA | 90018 | AA2209 | 11560 | G | BUY | 15.00 |
※太文字部分が変更された値となります。
試してみたこと
apply()で対処すればいいのでは?と思いコードを書いてみましたが、期待通りに動きませんでした。
単純に、「item」が「SELL」のとき、「-1」を乗算するという考えです。
とりあえず一番右に列を追加して動作確認をしましたが、返ってきた値は「None」でした。
文法をどのように記載すれば、希望の結果を返すことが可能でしょうか。
def func(x): if 'item' == 'SELL': return x * -1 df["test"] = df['volume'].apply(func) df 列1 trade_date product_class instrument_id instrument broker_code broker_name item volume test 0 12 20220606 A 60018 A 2206 11560 G SELL 181.0 None 1 38 20220606 A 90018 A 2209 11560 G SELL 1.0 None 2 56 20220606 AA 60019 AA 2206 11560 G SELL 395.0 None
if文を除いた場合には、一番右の列に計算された結果が返ってきていることを確認しています。
また、左辺のカラム名を指定することで、データフレームを上書きできることも確認しております。
def func(x): return x * -1 df["test"] = df['volume'].apply(func) df 列1 trade_date product_class instrument_id instrument broker_code broker_name item volume test 0 12 20220606 A 60018 A 2206 11560 G SELL 181.0 -181.0 1 38 20220606 A 90018 A 2209 11560 G SELL 1.0 -1.0 2 56 20220606 AA 60019 AA 2206 11560 G SELL 395.0 -395.0 3 84 20220606 B 60005 B 2206 11560 G SELL 1895.0 -1895.0 4 103 20220606 B 90005 B 2209 11560 G SELL 1179.0 -1179.0 5 8282 20220531 A 60018 A 2206 11560 G BUY 153.0 -153.0 6 56 20220606 AA 60019 AA 2206 11560 G BUY 395.0 -395.0 7 8282 20220531 A 60018 A 2206 11560 G SELL 153.0 -153.0 8 8305 20220531 AA 10019 AA 2206 11560 G SELL 8129.0 -8129.0 9 8345 20220531 B 10005 BB 2206 11560 G SELL 5708.0 -5708.0 10 8638 20220531 A 60018 A 2206 11560 G SELL 556.0 -556.0 11 8662 20220531 B 60005 B 2206 11560 G SELL 5862.0 -5862.0 12 9995 20220606 A 60018 A 2206 11560 G SELL 50.0 -50.0 13 9996 20220606 AA 90018 AA 2209 11560 G BUY 150.0 -150.0
※lamda式でもやってみようと思ったのですが、知識不足で対応できませんでした。。。
以下必要に応じてご利用ください。
**_テストデータs_** s = """列1,trade_date,product_class,instrument_id,instrument,broker_code,broker_name,item,volume 12,20220606,A,60018,A 2206,11560,G,SELL,181.0 38,20220606,A,90018,A 2209,11560,G,SELL,1.0 56,20220606,AA,60019,AA 2206,11560,G,SELL,395.0 84,20220606,B,60005,B 2206,11560,G,SELL,1895.0 103,20220606,B,90005,B 2209,11560,G,SELL,1179.0 8282,20220531,A,60018,A 2206,11560,G,BUY,153.0 56,20220606,AA,60019,AA 2206,11560,G,BUY,395.0 8282,20220531,A,60018,A 2206,11560,G,SELL,153.0 8305,20220531,AA,10019,AA 2206,11560,G,SELL,8129.0 8345,20220531,B,10005,BB 2206,11560,G,SELL,5708.0 8638,20220531,A,60018,A 2206,11560,G,SELL,556.0 8662,20220531,B,60005,B 2206,11560,G,SELL,5862.0 9995,20220606,A,60018,A 2206,11560,G,SELL,50.00 9996,20220606,AA,90018,AA 2209,11560,G,BUY,150.00"""
以上、どうぞよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/08 06:47