🍎

【Python】pandas の apply系関数まとめ

2023/05/21に公開

使用するライブラリ

import pandas as pd

(備考) 列指定の方法

df['a'] と指定すれば Series になる。
df[['a']] と指定すれば DataFrame になる。

apply系の関数の選択チートシート

新しい列を追加する処理を実装したい場面を想定。

in / out functions apply usage
pd.Series

pd.Series
pd.Series.map
pd.Series.apply
apply(lambda x: x * 10)
pd.Series

pd.DataFrame
pd.Series.apply apply(lambda x: pd.Series([x, x * 10], index=['1x', '10x']))
Seriesを返すfuncを指定する。
pd.DataFrame

pd.DataFrame
要素単位
pd.DataFrame.applymap
pd.DataFrame.apply
apply(lambda x: x * 10)
pd.DataFrame

pd.Series
pd.DataFrame.apply apply(lambda d: d['a'] * d['b'], axis=1)
axis=1 を指定する。
pd.DataFrame

pd.DataFrame
列単位
pd.DataFrame.apply apply(lambda d: [d['a'] + d['b'], d['a'] * d['b']], axis=1, result_type='expand')
listかSeriesを返すfuncを指定する。
axis=1, result_type='expand' を指定する。

Series の関数

pd.Series -> pd.Series

df['a'].map({'C': 'donut', 'D': 'lemon'})

map はdict を渡せる。

df['a'].map(lambda x: x * 10, na_action='ignore')

na_action='ignore' を指定すると、NaN はそのまま NaN を返す。

def ufunc(x, alpha, flag=False):
    return x + alpha
df['a'].apply(ufunc, alpha=5) # 他の書き方: args=(5, True)

NaN はそのまま NaN を返す。

pd.Series -> pd.DataFrame

df['a'].apply(
    lambda x: pd.Series([x, x * 10], index=['1x', '10x'])
)

Series の index の値が列名として採用される。
Series の代わりに list を返すと、list を要素にもつ Series ができる。

DataFrame の関数

pd.DataFrame -> pd.DataFrame (要素単位)

def ufunc(x, alpha):
    return x + alpha
df[['a', 'b']].applymap(ufunc, na_action='ignore', alpha=5)

pd.Series.map の複数列バージョン。
na_action='ignore' を指定すると、NaN はそのまま NaN を返す。 ※これもpd.Series.map と同じ。

df[['a', 'b']].apply(lambda x: x**2)

スカラー を受け取り、スカラーを返すような func を指定する。

pd.DataFrame -> pd.Series

df[['a', 'b']].apply(
    lambda d: d['a'] * d['b'], 
    axis=1,    # 列単位での処理
    result_type='reduce'    # 指定しなくてもよい
)

Series を受け取り、スカラーを返すような func を指定する。
list を返しても、list を要素にもつ Series ができる。

pd.DataFrame -> pd.DataFrame (列単位)

df[['a', 'b']].apply(
    lambda d: [d['a'] + d['b'], d['a'] * d['b']], 
    axis=1,    # 列単位での処理
    result_type='expand'
)

Series を受け取り、list を返すような func を指定する。result_type='expand' を指定することで、list を返すと複数列に展開されて DataFrame ができる。

df[['a', 'b']].apply(
    lambda d: pd.Series(['donut', 'lemon'], index=['c', 'd']), 
    axis=1    # 列単位での処理
)

Series を返す func を指定すれば、自動的にresult_type='expand' と同じような挙動になる。

参考

https://note.nkmk.me/python-pandas-map-applymap-apply/

Discussion