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


103

私は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)、パンダは1つのステップで問題を解決するための特別な構文を提供しますか(3つの新しい列を作成して結果を組み合わせる必要はありません)?


関数を定義し、これをに渡してapply設定axis=1するだけで機能しますが、必要なものを提供する操作を考えることができるかどうかは
わかり

あなたの解決策は、3つの列を作成し、それらを1つの列に結合することを意味しますか、それとも何か違うことを考えていますか?
ナットシップ2014

「3列作成」と言われ続けますが、何を言っているのかわかりません。
DSM

1
@DSMはこの質問に答えましたがdf['C']=df.apply(myFunc(row), axis=1)、myFuncが必要なことを実行する場所のようなものを意味しました。これには、「3列」の作成は含まれません
EdChum 2014

回答:


152

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

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

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

1
ありがとう、私はパンダから始めています、そしてこれは非常に役に立ちました+1
nutship 2014

4
関数の行と一緒に別のパラメーターを渡したい場合はどうなりますか?私が行う場合は、行が定義されていないと言う...
プラシャンスManoharさん

3
あなたは使用する必要がありますargsのパラメータ.apply機能:pandas.pydata.org/pandas-docs/stable/generated/...を
Zelazny7

1
私はPythonを学んでいる古いSASユーザーですが、間違いなく学習曲線があります。:-)たとえば、上記のコードはSASで次のように記述できますdata df; set df; if A=B then C=0; else if A>B then C=1; else C=-1; run;。非常にエレガントでシンプル。
RobertF

1
明確に定義された答え
SahilNagpal19年

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

インデックスを使用して簡単に解決できます。コードの最初の行はそのようになります。columnがcolumnAと等しい場合は、columnBを作成Cして0に設定します。


17

この特定の関係では、次を使用できます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

6

ここに画像の説明を入力してください

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

50歳を超える場合は、古い=はいと見なします。それ以外の場合は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"


1

複数のif 条件がある場合numpy.selectは、次の方法があります。

In [4102]: import numpy as np
In [4098]: conditions = [df.A.eq(df.B), df.A.gt(df.B), df.A.lt(df.B)]
In [4096]: choices = [0, 1, -1]

In [4100]: df['C'] = np.select(conditions, choices)

In [4101]: df
Out[4101]: 
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.