Pythonの以下のようなコードでワーニングが発生しました。
コード
df[col+'_max'] = df.groupby(['A','B','C'])[col].transform(max)
ワーニング
FutureWarning: The provided callable <built-in function max> is currently using SeriesGroupBy.max. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string “max” instead.
ワーニングの解消
ワーニングは、Pandasの将来のバージョンでgroupby
に対してtransform
メソッドを使用する際の挙動が変更されることを警告しています。現在のバージョンでは、transform
メソッドに組み込み関数のmax
を直接渡すと、自動的にSeriesGroupBy.max
が使用されますが、将来のバージョンではmax
関数が直接使用されるようです。
以下のように、transform
メソッドにmax
関数を文字列として渡すように変更するとワーニングが発生しなくなりました。
df[col+'_max'] = df.groupby(['A','B','C'])[col].transform('max')
現在の挙動
現在のPandasでは、groupby
オブジェクトに対してtransform
メソッドを使用する際に、Pythonの組み込み関数(例えばmax
)を直接渡すと、Pandasはその関数に対応する自身の集約関数を内部で使用します。つまり、max
を渡すと、Pandasは各グループに対して自動的にSeriesGroupBy.max
メソッドを呼び出します。
将来の挙動
将来のPandasのバージョンでは、transform
メソッドに渡された関数(本記事の例ではmax
)が、そのまま直接各グループに適用されるようになります。つまり、Pandasが自動的に対応する集約関数に変換するのではなく、提供された関数そのものが各グループのデータに対して実行されることを意味します。
この変更により、Pandasのtransform
メソッドがより汎用的になり、カスタム関数やラムダ式など、組み込み関数以外の関数も簡単に使用できるようになります。しかし、既存のコードの挙動が変わる可能性があるため、コードを適宜更新しておく必要があるようです。
また、組み込み関数やユーザー定義関数を使用する際には、その関数が期待する形式でデータを処理する責任がユーザーに移ると考えられます。