質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

535閲覧

pandas内のdef文とif文による条件分岐の記載方法に関して

karakarakarappo

総合スコア28

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/06/07 15:14

閲覧頂き、ありがとうございます。

pandasでのデータ加工に関して不明点があり、質問させて頂きます。

プログラミング初心者のため、知識不足でありますが、ご容赦頂けると幸いです。


実現したいこと

pythonのpandasを用いて、CSVデータより以下のデータフレームを作成しました。
(そのデータフレーム名は「s」とします。)

今回実現したいことは、以下の内容を条件式を用いて計算することです。

  • 「item」が「SELL」の場合は、「volume」に「-1」を乗算する
  • 「product_class」が「AA」の場合は、「volume」に「1/10」を乗算する

●現状データフレーム 「s」

trade_dateproduct_classinstrument_idinstrumentbroker_codebroker_nameitemvolume
1220220606A60018A 220611560GSELL181.0
3820220606A90018A 220911560GSELL1.0
5620220606AA60019AA 220611560GSELL395.0
8420220606B60005B 220611560GSELL1895.0
10320220606B90005B 220911560GSELL1179.0
828220220531A60018A 220611560GBUY153.0
5620220606AA60019AA 220611560GBUY395.0
828220220531A60018A 220611560GSELL153.0
830520220531AA10019AA220611560GSELL8129.0
834520220531B10005BB 220611560GSELL5708.0
863820220531A60018A 220611560GSELL556.0
866220220531B60005B 220611560GSELL5862.0
999520220606A60018A 220611560GSELL50.00
999620220606AA90018AA220911560GBUY150.00

●変換したいデータの形式 「s_1」

trade_dateproduct_classinstrument_idinstrumentbroker_codebroker_nameitemvolume
1220220606A60018A 220611560GSELL-181.0
3820220606A90018A 220911560GSELL-1.0
5620220606AA60019AA 220611560GSELL-39.50
8420220606B60005B 220611560GSELL-1895.0
10320220606B90005B 220911560GSELL-1179.0
828220220531A60018A 220611560GBUY153.0
5620220606AA60019AA 220611560GBUY39.50
828220220531A60018A 220611560GSELL-153.0
830520220531AA10019AA220611560GSELL-812.90
834520220531B10005BB 220611560GSELL-5708.0
863820220531A60018A 220611560GSELL-556.0
866220220531B60005B 220611560GSELL-5862.0
999520220606A60018A 220611560GSELL-50.0
999620220606AA90018AA220911560GBUY15.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"""

以上、どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1df.loc[df['item']=='SELL', 'volume'] *= -1 2df.loc[df['product_class']=='AA', 'volume'] *= 0.1

投稿2022/06/07 22:38

melian

総合スコア19798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karakarakarappo

2022/06/08 06:47

回答ありがとうございます。 単純に解決できるようで、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問