web-dev-qa-db-ja.com

python pandas-列に2つの引数を持つ関数を適用

引数として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をデータフレームの列にする必要があります。例えばRealTimedf['TimeCol']と2番目の引数はdf ['ResponseCol'] `です。そして、結果をデータフレームの新しい列にしたいと思います。私は 複数スレッド に出会いましたが、それらは同様の質問に答えましたが、それらの引数はデータフレームの行の値ではなく変数であるようです。

私は以下を試しましたが、うまくいきませんでした:

df['NewCol'] = df.apply(segmentMatch, args=(df['TimeCol'], df['ResponseCol']), axis=1)
14
Maria

なぜこれをしないのですか?

df['NewCol'] = df.apply(lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']), axis=1)

例のように列を引数として渡すのではなく、各行の適切なエントリを引数として渡すだけで、結果を'NewCol'に格納します。

26
N. Wouda

外部で関数を定義する場合、ラムダ関数は実際には必要ありません。

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