以下のように定義された関数とデータフレームがあるとします。
def get_sublist(sta, end):
return mylist[sta:end+1]
df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']
ここで、の 2 つの列get_sublist
に適用して、要素ごとに新しい列を計算し、次のような出力を取得します。df
'col_1', 'col_2'
'col_3'
ID col_1 col_2 col_3
0 1 0 1 ['a', 'b']
1 2 2 4 ['c', 'd', 'e']
2 3 3 5 ['d', 'e', 'f']
私は試した
df['col_3'] = df[['col_1','col_2']].apply(get_sublist, axis=1)
しかし、その結果
TypeError: get_sublist() missing 1 required positional argument:
どうすればいいのですか?
ベストアンサー1
Pandas では、これを 1 行で簡単に実行できます。
df['col_3'] = df.apply(lambda x: f(x.col_1, x.col_2), axis=1)
これにより、f
複数の入力値を持つユーザー定義関数が可能になり、列にアクセスするために (安全でない) 数値インデックスではなく (安全な) 列名が使用されます。
データ付きの例(元の質問に基づく):
import pandas as pd
df = pd.DataFrame({'ID':['1', '2', '3'], 'col_1': [0, 2, 3], 'col_2':[1, 4, 5]})
mylist = ['a', 'b', 'c', 'd', 'e', 'f']
def get_sublist(sta,end):
return mylist[sta:end+1]
df['col_3'] = df.apply(lambda x: get_sublist(x.col_1, x.col_2), axis=1)
出力print(df)
:
ID col_1 col_2 col_3
0 1 0 1 [a, b]
1 2 2 4 [c, d, e]
2 3 3 5 [d, e, f]
列名にスペースが含まれている場合、または既存のデータフレーム属性と名前を共有している場合は、角括弧を使用してインデックスを作成できます。
df['col_3'] = df.apply(lambda x: f(x['col 1'], x['col 2']), axis=1)