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

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

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

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

783閲覧

if文 中身の要素ごとの記述方法

Masakuni

総合スコア14

if

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/05/04 06:49

編集2019/05/04 08:15

文法的な部分でつまづいています。
train_df[payment_)の中身に応じてcounterの数字をあげていくようにしていきたいと思い下のコードを試したところ下記のようなエラーが出ました。
要素一つ一つに対しての計算がしたいですがうまくいっていないようです。
ご教授お願い致します。

counter=0 if train_df["payment_9"]>0: counter+=1 if train_df["payment_8"]>0: counter+=1 if train_df["payment_7"]>0: counter+=1
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-9-4c007e03de50> in <module> 1 counter=0 ----> 2 if train_df["payment_9"]>0: 3 counter=1 4 if train_df["payment_8"]>0: 5 counter+=1 /anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __nonzero__(self) 1476 raise ValueError("The truth value of a {0} is ambiguous. " 1477 "Use a.empty, a.bool(), a.item(), a.any() or a.all()." -> 1478 .format(self.__class__.__name__)) 1479 1480 __bool__ = __nonzero__ ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

追記です

train_df

この場合
0に対してcounter=2

payment9>0 でcounter=1になり 
payment8>0 でcounter=2
payment7が-1なのでcounterの計測が終わり counter=2

1に対してcounter=0
2に対してcounter=0
3に対してcounter=0
4に対してcounter=0

このような手順が理想です

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

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

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

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

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

can110

2019/05/04 08:26

「0に対して」の「0」とはDataFrameのインデックス番号のこと すなわち行毎にcounter値を別個に算出するということでしょうか? また、counter値は 「payment_9列から右側に向けて0以下の数値が現れるまでの1以上の数の出現数」 と考えてよいでしょうか?
Masakuni

2019/05/04 08:37 編集

おっしゃる通りです。 言葉を知らず説明が分かりにくく申し訳ありません。 インデックス毎にcounterの値に payment_9から右側に向けて0以下が現れるまでの1以上の出現数を入れたいです。
guest

回答1

0

ベストアンサー

train_df["payment~"]には複数の値が入っていますので単純なif判定できません。
そのすべて.all() あるいは いずれか.any() が0より大きいのかを指定する必要があります。

Python

1import pandas as pd 2df = pd.DataFrame({'val':[-1,1,2]}) 3 4if (df['val'] >= 0).any(): # いずれか0以上 5 print('any') 6 7if (df['val'] >= 0).all(): # すべて0以上 8 print('all') 9""" 10any 11"""

コメントを受けて

(-1,0,1,2)の出現数を求めたいなら、たとえば以下のようにして得られます。

Python

1import pandas as pd 2df = pd.DataFrame({'val':[-1,-1,-1,0,1,2,2]}) 3 4count = {} 5for n in [-1,0,1,2]: 6 count[n] = (df['val'] == n).sum() 7 8print(count) # {-1: 3, 0: 1, 1: 1, 2: 2}

質問修正をうけて

以下のようにDataFrameに対してループ処理を行えば求めることができます。

Python

1import pandas as pd 2 3df = pd.DataFrame([[2,2,1,-1],[0,1,2,2],[1,0,1,2]],columns=['A','B','C','D']) 4print(df) 5 6# 行毎のループ 7for idx, row in df.iterrows(): 8 counter = 0 9 # 対象列毎のループ 10 for val in row['A':'D']: 11 if val <= 0: 12 break 13 counter += 1 14 df.loc[idx,'counter'] = counter 15 16df['counter'] = df['counter'].astype(int) # float -> int 17print(df) 18""" 19 A B C D counter 200 2 2 1 -1 3 211 0 1 2 2 0 222 1 0 1 2 1 23"""

投稿2019/05/04 07:04

編集2019/05/04 08:41
can110

総合スコア38266

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

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

Masakuni

2019/05/04 07:29

can110様ご回答有難うございます。 train_df[payment]は2000に対して(-1,0,1,2)のいずれかが入っています。2000の中身一つ一つに対してcounterを定義して計算をしていきたいと考えています。 教えて頂いた計算は2000のいずれか0以上もしくは全てが0以上の計算になると思います。 中身それぞれに対しての場合はどのようにするべきか教えていただけないでしょうか。 説明が十分でなくお手数をおかけして申し訳ありませんがよろしくお願い致します。
can110

2019/05/04 07:38

「2000の中身一つ一つに対してcounterを定義して計算をしていきたい」においてどんな計算をしたいのかがよく分かりません。単純に(-1,0,1,2) の各出現数を求めたいということでしょうか? 回答に追記しました。
Masakuni

2019/05/04 07:45

ご回答有難うございます。 train_df[payment9]>0の場合counter=1それ以外の場合counter=0 train_df[payment9]>0の場合かつtrain_df[payment8]>0の場合counter=2と中身が1と2の場合一つ前のtrain_df[payment]に戻ってさらにカウンターを増やすかどうかの計算をそれぞれの中身に対して行いたいです。
can110

2019/05/04 07:56

ちょっと理解できませんので具体的なデータ値と理想の結果を手順とともに 例としてあげてもらえないでしょうか(質問本文に追記ください)? train_df[~9]とtrain_df[~8]の要素数は数個、せいぜい5,6個でよいです。
Masakuni

2019/05/04 08:03

有難うございます。 今から追記いたします。
Masakuni

2019/05/04 08:17

追記いたしました。 このような手順を0から2000まで実行してcounterを一つの特徴量として使いたいと考えています。
Masakuni

2019/05/04 08:53

can110様 前回の質問に引き続き本当に有難うございました。 ご丁寧に教えて頂いて本当に助かりました。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問