web-dev-qa-db-ja.com

if else function in pandas dataframe

データフレームにif条件を適用しようとしていますが、何かがありません(エラー:シリーズの真理値があいまいです。a.empty、a.bool()、a.item()、aを使用します。 any()またはa.all()。)

raw_data = {'age1': [23,45,21],'age2': [10,20,50]}
df = pd.DataFrame(raw_data, columns = ['age1','age2'])

def my_fun (var1,var2,var3):
if (df[var1]-df[var2])>0 :
    df[var3]=df[var1]-df[var2]
else:
    df[var3]=0
print(df[var3])

my_fun('age1','age2','diff')
6
progster

numpy.where

def my_fun (var1,var2,var3):
    df[var3]= np.where((df[var1]-df[var2])>0, df[var1]-df[var2], 0)
    return df

df1 = my_fun('age1','age2','diff')
print (df1)
   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0

エラーは こちら の方が適切です。

applyを使用したより遅いソリューション、必要な場合axis=1行ごとのデータ処理の場合:

def my_fun(x, var1, var2, var3):
    print (x)
    if (x[var1]-x[var2])>0 :
        x[var3]=x[var1]-x[var2]
    else:
        x[var3]=0
    return x    

print (df.apply(lambda x: my_fun(x, 'age1', 'age2','diff'), axis=1))
   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0

locを使用することも可能ですが、データが上書きされる場合があります。

def my_fun(x, var1, var2, var3):
    print (x)
    mask = (x[var1]-x[var2])>0
    x.loc[mask, var3] = x[var1]-x[var2]
    x.loc[~mask, var3] = 0

    return x    

print (my_fun(df, 'age1', 'age2','diff'))
   age1  age2  diff
0    23    10  13.0
1    45    20  25.0
2    21    50   0.0
10
jezrael

pandas.Series.whereを使用できます

df.assign(age3=(df.age1 - df.age2).where(df.age1 > df.age2, 0))

   age1  age2  age3
0    23    10    13
1    45    20    25
2    21    50     0

これを関数でラップできます

def my_fun(v1, v2):
    return v1.sub(v2).where(v1 > v2, 0)

df.assign(age3=my_fun(df.age1, df.age2))

   age1  age2  age3
0    23    10    13
1    45    20    25
2    21    50     0
4
piRSquared

np.whereまたはpd.Series.whereを使用しない別の方法があります。それが良いと言っているわけではありませんが、今日、このソリューションを困難な問題に適応させようとした後、whereの構文はそれほど直感的ではありませんでした。最終的には、どこで可能かどうかはわかりませんが、次の方法を使用すると、サブセットを変更する前に見ることができ、私はより迅速にソリューションにつながりました。もちろん、ここでもOPで機能します。

Pandasのようにデータフレームのスライスに意図的に値を設定するため、頻繁に警告しないように警告します。

This answerは、正しい方法を示しています。

以下にスライスを示します。

df.loc[df['age1'] - df['age2'] > 0]

..これは次のようになります。

   age1  age2
0    23    10
1    45    20

スライスを変更した後に残す値の元のデータフレームに追加の列を追加します。

df['diff'] = 0

次に、スライスを変更します。

df.loc[df['age1'] - df['age2'] > 0, 'diff'] = df['age1'] - df['age2']

..そして結果:

   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0
1
cardamom