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

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

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

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

Python 3.x

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

pandas

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

Q&A

解決済

1回答

655閲覧

Dataframeで任意のセルの条件によって前の行の値を参照してセルの値を変更したい

kou7711

総合スコア5

for

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

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/05/01 08:18

前提・実現したいこと

Python初心者です。大変初歩的な内容で恐縮ですが、
ご回答いただけると幸いです。

pandasのdataframeを使用して、データの図示や相関分析を行いたいと考えており、
その前処理で質問があります。
具体的には、dataframe内の、あるカラムの値で条件分岐し、別のカラムの値を前のカラムに定数を加えるというものです。

下記質問用のダミーデータセットで説明いたします。

__A B
0 X 0
1 Z 0
2 X 0
3 Y 1
4 X 1
5 Y 2
6 X 2
7 Z 2

A:条件分岐列
B: 値更新用列

内容:
A列がY以外の場合、B列は前の行と同じ値を入れる。
A列がYの場合、B列に前の行の値に「1」加えた値を入れる。

発生している問題・エラーメッセージ

下記のようなコードを書いてみましたが、思うような結果が出ませんでした。
Pandasのdataframeの場合、for文と関数をどう組み合わせて良いかわからなくなってしまいました。

該当のソースコード

df```

import pandas as pd

df = pd.DataFrame({'A': ['X','Z','X','Y','X','Y','X','Z'],

'B': [0, 0, 0, 0, 0, 0, 0, 0]}, index=[0, 1, 2, 3, 4, 5, 6, 7])

for n in df:

def add(n=2):
return df.loc[n,"B"] == df.loc[n-1,"B"]+1

df

### 試したこと 上記のコードを試しました。 iterrowsなども検討しましたが、前の行の結果を参照するということができず、 思うような結果が得られませんでした。 ### 補足情報(FW/ツールのバージョンなど) Python3を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず愚直な方法はこんな感じです。一行目の扱いがよくわからなかったのでとりあえずYでもYでなくてもゼロのままにしています。

python

1>>> import pandas as pd 2>>> df = pd.DataFrame({'A': ['X','Z','X','Y','X','Y','X','Z'], 3... 4... 'B': [0, 0, 0, 0, 0, 0, 0, 0]}, 5... 6... index=[0, 1, 2, 3, 4, 5, 6, 7]) 7>>> for i in range(len(df)): 8... if i == 0: 9... continue 10... if df.loc[i, "A"] == "Y": 11... df.loc[i, "B"] = df.loc[i-1, "B"] + 1 12... else: 13... df.loc[i, "B"] = df.loc[i-1, "B"] 14... 15>>> df 16 A B 170 X 0 181 Z 0 192 X 0 203 Y 1 214 X 1 225 Y 2 236 X 2 247 Z 2 25

ただデータフレームをforで回すのはとても遅いです。小さいデータならそんなに問題ないと思いますが。

いろんな方法があると思いますが、例えば以下のようにもかけます。

python

1>>> df = pd.DataFrame({'A': ['X','Z','X','Y','X','Y','X','Z'], 2... 3... 'B': [0, 0, 0, 0, 0, 0, 0, 0]}, 4... 5... index=[0, 1, 2, 3, 4, 5, 6, 7]) 6>>> df["B"] = (df["A"].values == "Y").cumsum() 7>>> df 8 A B 90 X 0 101 Z 0 112 X 0 123 Y 1 134 X 1 145 Y 2 156 X 2 167 Z 2 17

投稿2020/05/01 08:45

nouken

総合スコア369

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

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

kou7711

2020/05/01 11:38

早速のご回答ありがとうござます。やはりデータフレームをForで回すのは遅いのですね。 cumsumでこのような方法があるとは知りませんでした。 この方法で進めて行きます。 とても為になりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問