引数として2つの異なる列の値を持つpython pandas関数を作成できますか?
2つの列に同じ範囲の値がある場合に1を返す関数があります。それ以外の場合は、0を返します。
def segmentMatch(RealTime, ResponseTime):
if RealTime <= 566 and ResponseTime <= 566:
matchVar = 1
Elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
matchVar = 1
Elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
matchVar = 1
else:
matchVar = 0
return matchVar
関数がその列の各行の値を取るように、最初の引数RealTime
をデータフレームの列にする必要があります。例えばRealTime
はdf['TimeCol']
と2番目の引数はdf ['ResponseCol'] `です。そして、結果をデータフレームの新しい列にしたいと思います。私は 複数スレッド に出会いましたが、それらは同様の質問に答えましたが、それらの引数はデータフレームの行の値ではなく変数であるようです。
私は以下を試しましたが、うまくいきませんでした:
df['NewCol'] = df.apply(segmentMatch, args=(df['TimeCol'], df['ResponseCol']), axis=1)
なぜこれをしないのですか?
df['NewCol'] = df.apply(lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']), axis=1)
例のように列を引数として渡すのではなく、各行の適切なエントリを引数として渡すだけで、結果を'NewCol'
に格納します。
外部で関数を定義する場合、ラムダ関数は実際には必要ありません。
def segmentMatch(vec):
RealTime = vec[0]
ResponseTime = vec[1]
if RealTime <= 566 and ResponseTime <= 566:
matchVar = 1
Elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
matchVar = 1
Elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
matchVar = 1
else:
matchVar = 0
return matchVar
df['NewCol'] = df[['TimeCol', 'ResponseCol']].apply(segmentMatch, axis=1)
「segmentMatch」が代わりに2つの値のベクトルを返す場合、次のことができます。
def segmentMatch(vec):
......
return pd.Series((matchVar1, matchVar2))
df[['NewCol', 'NewCol2']] = df[['TimeCol','ResponseCol']].apply(segmentMatch, axis=1)