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つの新しい列を作成してから結果を組み合わせる必要はありません) ?
上記のアプローチのいくつかを形式化するには:
次のようにデータフレームの行を操作する関数を作成します。
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.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では、条件の周りに括弧が使用されています。
この特定の関係では、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