1. ホーム
  2. python

[解決済み] if-elif-elseの条件に基づいて新しいカラムを作成する。

2022-06-13 10:03:55

質問

データフレーム df :

    A    B
a   2    2 
b   3    1
c   1    3

以下の条件で新しいカラムを作りたい。

もし行 A == B: 0

もし行が A > B: 1

もし行が A < B: -1

ということで、上の表から考えると、そうなるはずです。

    A    B    C
a   2    2    0
b   3    1    1
c   1    3   -1 

典型的な if else の場合、私は np.where(df.A > df.B, 1, -1) を行う場合、pandasは私の問題を1つのステップで解決するための特別な構文を提供しますか(3つの新しい列を作成し、結果を結合する必要なし)?

どのように解決するのですか?

上に述べたアプローチのいくつかを形式化すること。

データフレームの行を操作する関数を以下のように作成します。

def f(row):
    if row['A'] == row['B']:
        val = 0
    elif row['A'] > row['B']:
        val = 1
    else:
        val = -1
    return val

これをデータフレームに適用します。 axis=1 オプションを渡して適用します。

In [1]: df['C'] = df.apply(f, axis=1)

In [2]: df
Out[2]:
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

もちろん、これはベクトル化されていないので、多数のレコードにスケールしたときのパフォーマンスはあまり良くないかもしれません。 それでも、ずっと読みやすいと思います。特にSASのバックグラウンドから来る人は。

Edit

以下はベクター化したものです。

df['C'] = np.where(
    df['A'] == df['B'], 0, np.where(
    df['A'] >  df['B'], 1, -1))