前提・実現したいこと
B列[XYZ_MA60]とC列[XYZ_MA120]を比較して、該当行がB>=CならD列[XYZ_MA60/120]の該当行に1を代入し、
そうでなければ(B<C)、D列[XYZ_MA60/120]の該当行に-1を代入したいです。
データ数は毎回変化します。
発生している問題・エラーメッセージ
条件に該当する行のD列に数値を追加していくのに、どう書けば良いかがわかりません。
試したこと
df_gc=df[df['XYZ_MA60']>=df['XYZ_MA120']]
でフィルタをかけれることは分かったのですが、そこからD列の該当行に1を追加する方法が分かりませんでした。
assignを使うのでしょうか?
また、繰り返しでfor文を使うのでしょうか?
お知恵をお貸しください。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
この手の処理でループを使う必要は全くありません。むしろパフォーマンス的にはできるだけ使わない事を推奨します。
df_gc=df[df['XYZ_MA60']>=df['XYZ_MA120']]
でフィルタをかけれることは分かったのですが、そこからD列の該当行に1を追加する方法が分かりませんでした。
上記の場合.loc[]
を使って
Python
1df.loc[df['XYZ_MA60']>=df['XYZ_MA120'], 'XYZ_M60/120'] = 1
となります。
(ちょっと補足)
このmethodは.loc[行、列]
のように指定することで、戻り値として Viewと呼ばれる元のデータフレームの一部を切り出したものを返します。
このViewは元のDataFrameのデータに対する参照となりますので、Viewにデータを直接書き込むことで元のデータフレームを更新することが出来ます。
今回の場合は df['XYZ_MA60']>=df['XYZ_MA120']
にて該当する行をTrue
とした Boolean配列 が得られますのでこのデータを行に指定、、'XYZ_M60/120'を列を指定することで該当の位置にデータを書き込むことができるようになります。
(ここまで)
あとは(B<C)、D列[XYZ_MA60/120]の該当行に-1を入れる処理を追加して
Python
1df.loc[df['XYZ_MA60']>=df['XYZ_MA120'], 'XYZ_M60/120'] = 1 2df.loc[df['XYZ_MA60']<df['XYZ_MA120'], 'XYZ_M60/120'] = -1
となります。
投稿2020/05/06 02:39
編集2020/05/06 02:52総合スコア15898
0
Python
1import itertools 2 3idx_list = [idx for nums1, idx in enumerate("B行の数値たち")] 4 5for lft, rght, idx in itertools.product("B行の数値たち", "C行の数値たち", idx_list): 6 if float(lft) > float(rght): 7 "D行idx番目に1を入れる" 8 df.iat[3, idx] = 1 9 else: 10 "D行idx番目に-1を入れる" 11 df.iat[3, idx] = -1
投稿2020/05/05 23:21
編集2020/05/06 00:47総合スコア2722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 00:48
2020/05/06 01:32 編集
2020/05/06 02:18 編集
2020/05/06 02:00
2020/05/06 02:21 編集
2020/05/06 02:58
2020/05/06 03:06
2020/05/06 03:20
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 03:05 編集