データフレームに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')
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
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
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