if-elif-else条件に基づいて新しい列を作成する [重複] 質問する

if-elif-else条件に基づいて新しい列を作成する [重複] 質問する

DataFrame があります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 つの新しい列を作成して結果を結合する必要はありません)?

ベストアンサー1

上記のアプローチのいくつかを形式化するには、次のようになります。

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

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 のバックグラウンドを持つ人にとってはそうです。

編集

こちらはベクトル化されたバージョンです

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

おすすめ記事