質問: df.apply(func1(df['A'],df['B'], df['A'].shift(-1), df['B'].shift(-1))) ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: 質問の編集ありがとうございました。 今回の仕様の場合 * 『複数行にapply()を適用する』 と考えるよりも * 『複数行をまとめたDataFrameを作成し、そろDataFrameに対してapply()を適用する』 と考える方がシンプルです。 データのまとめ方ですが、まず各行の1つ下の行は**2**に書かれているように `DataFrame.shift(-1)` にて得ることができますので、 前処理として、`'A'`列と`'B'`列を`shift(-1)`した行をそれぞれ `'A2'`列と`'B2'`列に名前を変更(`rename()`)を行い、元のDataFrameに結合(`join()`)します。 すると ``` import pandas as pd df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5], 'B' : [10, 20, 30, 40, 50] }) df = df.join(df[['A', 'B']].rename(columns={'A':'A2','B':'B2'}).shift(-1)) # A B A2 B2 #0 1 10 2.0 20.0 #1 2 20 3.0 30.0 #2 3 30 4.0 40.0 #3 4 40 5.0 50.0 #4 5 50 NaN NaN ``` となりますので、このDataFrameの各行に対して `apply()` を適用すると良いだけとなります。 DataFrameの各列を関数 `my_func(x1, y1, x2, y2)`の各パラメータに対応させるには、`lambda` を経由して ``` df['R'] = df.apply(lambda row:f(row['A'],row['A2'],row['B'],row['B2']), axis=1) ``` または ``` df['R'] = df.apply(lambda row:f(*row[['A','A2','B','B2']]), axis=1) ``` の様に呼ぶことでの行えるかと思います。 あとは、もし`'A2'`列と`'B2'`列が不要であれば、以下のように削除するだけです。 ``` df = df.drop(columns=['A2', 'B2']) ```