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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Q&A

解決済

1回答

792閲覧

特定の行に対して特定列の値を加減したい

Dantesu

総合スコア8

Python 3.x

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

1グッド

0クリップ

投稿2021/09/25 12:04

編集2021/09/25 12:07

前提・実現したいこと

以下の架空の表のうち、month列の「Jun」または「Dec」の含まれる合計4行に対して、cost列の値から数を引きたいです。
#前処理をしているうちの1工程で、特定の列全行に一律で何かを足したりするのはできますが、(df['update_cost']=df['cost']+数字)特定行に処理ができません。
手計算でも答えは出せますが、データが増えた時のために知りたいです。
どうぞ宜しくお願いします。

month sales cost
19-Apr 211 187
19-May 228 199
19-Jun 246 255
19-Jul 264 232
19-Aug 277 244
19-Sep 270 241
19-Oct 262 233
19-Nov 242 222
19-Dec 230 247
20-Jan 225 207
20-Feb 215 195
20-Mar 237 208
20-Apr 213 189
20-May 230 202
20-Jun 248 259
20-Jul 268 235
20-Aug 277 246
20-Sep 271 242
20-Oct 264 235
20-Nov 244 224
20-Dec 234 250
20-Jan 227 209
21-Feb 216 195
21-Mar 239 210

試したこと

str.containを['month']列に行い、[Jun][Dec]を含む4行を抽出する事はできました。
下記のコードではエラーでした。
df['update_cost']=df['update_cost']-引きたい数.where(df.str.contains("Jun")',engine='python')

「エラー」
File "<ipython-input-217-371da03979c7>", line 1
df['update_cost']=df['update_cost']-36.where(df.str.contains("Jun")',engine='python')
^
SyntaxError: invalid syntax

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

変更したい行だけを変更する場合は、whereではなくmaskを使います。

python

1df['update_cost'] = df['cost'].mask(df['month'].str.contains("Jun") | df['month'].str.contains("Dec"), df['cost']-36)

実行結果は以下です。

python

1>>> print(df) 2 month sales cost 30 19-Apr 211 187 41 19-May 228 199 52 19-Jun 246 255 63 19-Jul 264 232 74 19-Aug 277 244 85 19-Sep 270 241 96 19-Oct 262 233 107 19-Nov 242 222 118 19-Dec 230 247 129 20-Jan 225 207 1310 20-Feb 215 195 1411 20-Mar 237 208 1512 20-Apr 213 189 1613 20-May 230 202 1714 20-Jun 248 259 1815 20-Jul 268 235 1916 20-Aug 277 246 2017 20-Sep 271 242 2118 20-Oct 264 235 2219 20-Nov 244 224 2320 20-Dec 234 250 2421 20-Jan 227 209 2522 21-Feb 216 195 2623 21-Mar 239 210 27>>> df['update_cost'] = df['cost'].mask(df['month'].str.contains("Jun") | df['month'].str.contains("Dec"), df['cost']-36) 28>>> print(df) 29 month sales cost update_cost 300 19-Apr 211 187 187 311 19-May 228 199 199 322 19-Jun 246 255 219 333 19-Jul 264 232 232 344 19-Aug 277 244 244 355 19-Sep 270 241 241 366 19-Oct 262 233 233 377 19-Nov 242 222 222 388 19-Dec 230 247 211 399 20-Jan 225 207 207 4010 20-Feb 215 195 195 4111 20-Mar 237 208 208 4212 20-Apr 213 189 189 4313 20-May 230 202 202 4414 20-Jun 248 259 223 4515 20-Jul 268 235 235 4616 20-Aug 277 246 246 4717 20-Sep 271 242 242 4818 20-Oct 264 235 235 4919 20-Nov 244 224 224 5020 20-Dec 234 250 214 5121 20-Jan 227 209 209 5222 21-Feb 216 195 195 5323 21-Mar 239 210 210

投稿2021/09/25 12:25

ppaul

総合スコア24670

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

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

Dantesu

2021/09/25 12:28

ありがとうございます!
Daregada

2021/09/25 12:30

str.containsの第1引数には正規表現が使えるので、"Jun|Dec"でいいのでは。
ppaul

2021/09/25 12:39

そういえばそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問