web-dev-qa-db-ja.com

if-Elif-else条件に基づいて新しい列を作成する

DataFrame dfがあります:

    A    B
a   2    2 
b   3    1
c   1    3

次の基準に基づいて新しい列を作成します。

A == B: 0の場合

rowA > 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つの新しい列を作成してから結果を組み合わせる必要はありません) ?

46
nutship

上記のアプローチのいくつかを形式化するには:

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

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バックグラウンドから来ています。

77
Zelazny7
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1

インデックスを使用して簡単に解決できます。コードの最初の行は次のようになります。列「A」が列「B」に等しい場合、列「C」を作成して0に設定します。注意してください次のdf.loc [(df ['A'] == df ['B'])、 'C'] = 0では、条件の周りに括弧が使用されています。

18
Brian

この特定の関係では、np.signを使用できます。

>>> df["C"] = np.sign(df.A - df.B)
>>> df
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1
8
DSM

enter image description here

上記が元のデータフレームであり、新しい列「old」を追加するとします

年齢が50歳を超える場合は、older = yesと見なし、それ以外の場合はFalse

ステップ1:年齢が50を超える行のインデックスを取得する

row_indexes=df[df['age']>=50].index

ステップ2:.locを使用して、新しい値を列に割り当てることができます

df.loc[row_indexes,'elderly']="yes"

50歳未満の年齢と同じ

row_indexes=df[df['age']<50].index

df[row_indexes,'elderly']="no"

2
Ravi G