🍎
【Python】pandas の apply系関数まとめ
使用するライブラリ
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'
と同じような挙動になる。
参考
Discussion