Как применить сложную функцию к столбцу без «применения»? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть кадр данных df:

A    | B   | C   | ...         | D
1000 | 600 | 600 | productdesc | 0
1500 | 400 | 600 | productdesc | 1
1000 | 600 | 300 | productdesc | 0

и функция do_stuff ():

def do_stuff(A, B, C):
    * calculations *
    return result

Я хотел бы применить эту функцию к моему df кадра данных. Из-за размера моего фрейма данных и сложности моей функции я стараюсь избегать .apply ().

Есть ли какой-либо другой метод использования функции в фрейме данных со значениями столбцов каждой строки в качестве параметров функции для результат для каждой строки в новый столбец? Что-то вроде

df["scale_factor"] = do_stuff(df[["A", "B", "C"]])

Конечный результат должен быть:

A    | B   | C   | ...         | D | scale_factor
1000 | 600 | 600 | productdesc | 0 | *result of do_stuff(1000, 600, 600)*
1500 | 400 | 600 | productdesc | 1 | *result of do_stuff(1500, 400, 600)*
1000 | 600 | 300 | productdesc | 0 | *result of do_stuff(1000, 600, 300)*

1 Ответ

1 голос
/ 05 августа 2020

Просто нужно убедиться, что вы возвращаете list или np.array того же размера, что и фрейм данных

df = pd.DataFrame({f"col{i}":[random.randint(0,10) for i in range(10)] for i in range(4)})

def dostuff(a):
    return [f"*result of dostuff({x},{a[1][i]},{a[2][i]})*" for i,x in enumerate(a[0])]

df["scale_factor"] = dostuff(np.array(df[["col0","col1","col2"]]).T)
print(df.to_string(index=False))

output

 col0  col1  col2  col3                 scale_factor
    2     0     3     2   *result of dostuff(2,0,3)*
    9     6    10     2  *result of dostuff(9,6,10)*
    0     7     8     4   *result of dostuff(0,7,8)*
   10     2     9     6  *result of dostuff(10,2,9)*
    8     3     4     2   *result of dostuff(8,3,4)*
    2     2     2     5   *result of dostuff(2,2,2)*
    1     8     1     5   *result of dostuff(1,8,1)*
    0     1     6     6   *result of dostuff(0,1,6)*
    2     0    10     6  *result of dostuff(2,0,10)*
    9    10     8     2  *result of dostuff(9,10,8)*
...