Pandasデータフレームの2つの列に関数を適用する方法 質問する

Pandasデータフレームの2つの列に関数を適用する方法 質問する

以下のように定義された関数とデータフレームがあるとします。

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)

おすすめ記事