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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

pandas

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

Q&A

解決済

3回答

2839閲覧

pythonのDataframeで一行ごとに繰り返し処理をさせたい

tsurumesoaki

総合スコア7

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

pandas

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

0グッド

0クリップ

投稿2018/01/21 07:33

編集2018/01/21 07:40

###前提・実現したいこと
python初心者です。
close>20ma列がSからL,LからSに変わった場合にclose列の値を返して、そうでない場合はposition列の直前の文字を返す、という条件で、一行ごとに条件通りの処理をさせたいのですが、ValueErrorとなりうまくいきません。
for文の書き方がおかしいのだろうということしかわかりません。どこが間違っているかご教示お願いします。

date open high low close 20ma  change  close>20ma
2011-01-26 1390 1445 1388 1432 NaN  2.652330 S
2011-01-27 1410 1448 1410 1430 NaN  -0.139665 S
2011-01-28 1401 1410 1390 1393 NaN  -2.587413 S
2011-01-31 1387 1400 1387 1392 NaN  -0.071788 S
2011-02-01 1392 1397 1369 1370 1352.85 -1.580460 L
2011-02-02 1385 1385 1335 1355 1352.60 -1.094891 L
2011-02-03 1345 1345 1311 1326 1348.95 -2.140221 S
2011-02-04 1326 1330 1326 1330 1345.50 0.301659 S

エラーメッセージ

ValueError: Length of values does not match length of index ###該当のソースコード

df['position'] = []
for i in range(len(df)):
np.where(df.iloc[i, 6] != df.iloc[i+1, 6], df.iloc[i+1, 3], df.iloc[i, 7])         
df['position'].append(i)

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

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

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

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

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

guest

回答3

0

for文を使わずに実装するとこんな感じでしょうか。

python

1df['one_before'] = df['close>20ma'].shift(1) 2df.loc[df['close>20ma'] != df['one_before] , 'position'] = df['close'] 3df.fillna(inplace=True,method='ffill')

『close>20ma列がSからL,LからSに変わった場合』という条件は、別の言い方をすると1行前の値と今の行の値が異なるということと同じです。
そこでdf['close>20ma'].shift(1)で引数分だけ値をシフトした結果を列にセットします。この結果と元のclose>20maを比較して同じのpositionにcloseを設定します。この場合、条件に該当しないpositionはnanになるのでfillnaを使って埋めます。埋め方のルールは直前の値を適用するということなので、methodにffillを使うことにしました。

うまく要望をとらえているかわかりませんが参考にしてください。

投稿2018/01/21 10:07

R.Shigemori

総合スコア3376

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

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

0

ベストアンサー

ソースコードをソースコードとして表示していないためインデントが崩れています。
きちんと表記を守りましょう。

そのErrorは

df['position'] = []

で出ているような気がするのは気のせいでしょうか。
エラーメッセージにはエラーが発生した箇所が書かれているのできちんと読みましょう。

Traceback (most recent call last): File "dftest.py", line 5, in <module> df['position'] = [] File "pandas\core\frame.py", line 2519, in __setitem__ self._set_item(key, value) File "pandas\core\frame.py", line 2585, in _set_item value = self._sanitize_column(key, value) File "pandas\core\frame.py", line 2760, in _sanitize_column value = _sanitize_index(value, self.index, copy=False) File "pandas\core\series.py", line 3121, in _sanitize_index raise ValueError('Length of values does not match length of ' 'index') ValueError: Length of values does not match length of index

何をやりたいのか意図はつかめかねますが

df['position'] = ""

などとし、空文字をつめるとエラーはでなくなります。

df['position'].append(i)

これもエラーが出ます。
また、

for i in range(len(df)):

この方法でループを回すと、
一番最後の行で
i+1 行目が存在しないため

np.where(df.iloc[i, 6] != df.iloc[i+1, 6], df.iloc[i+1, 3], df.iloc[i, 7])  

ここでもエラーが出ます

投稿2018/01/21 08:35

calkinos

総合スコア452

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

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

tsurumesoaki

2018/01/21 11:12

回答ありがとうございます。 エラーメッセージの読み方すら分かっていなかったようで、 いろいろ抜けていたところを見直して 無事エラーを出さず処理できました。
guest

0

forのに関して、これでは、「一行おき」ではなく、「一行ずらしてデータを全部」にしかなりません。最終的に存在しないデータを参照しようとしてエラーとなるでしょう。

たぶんこうじゃないですかね:

python

1for i in range(1, len(df), 2): 2...

投稿2018/01/21 08:20

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問