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))