Как передать все столбцы данных в функции при использовании apply? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть pandas фрейм данных с несколькими столбцами, например

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=(100, 7)), columns=list('ABCDEFG'))

, и я хочу apply функцию, которая может принимать в качестве аргументов все столбцы фрейма данных:

# function would do something more complex potentially :)
def foo(a,b,c,d,e,f,g):
  # do stuff with a,b,c,d,e,f,g. Here I do something silly/simple
  return a + b*2 + c*3 + d*4 + e*5 + f*5 + g*5

Теперь я хотел бы применить foo ко всем строкам df. Какой правильный синтаксис для этого?

Мои попытки работают

df.apply(lambda row: foo(row[0], row[1], row[2], row[3], row[4], row[5], row[6]), axis = 1) # terrible
df.apply(lambda row: foo(*row), axis = 1) #  better

, но есть ли способ сделать это еще более кратко, например, без lambda?

1 Ответ

0 голосов
/ 04 февраля 2020

Простая настройка для функции сделает свое дело

def foo(a=df['A'],b=df['B'],c=df['C'],d=df['D'],e=df['E'],f=df['F'],g=df['G']):
    return a + b*2 + c*3 + d*4 + e*5 + f*5 + g*5

df.apply(foo)

       A     B     C     D     E     F     G
0    755   731   736   745   717   696   697
1   1365  1330  1321  1323  1332  1348  1367
2    985  1002   971   982  1012  1017  1052
3   1078  1016  1094  1034  1034  1049  1102
4   1045  1059  1041  1101  1100  1025  1041
..   ...   ...   ...   ...   ...   ...   ...
95  1318  1338  1341  1349  1357  1356  1358
96  1323  1387  1349  1321  1315  1370  1389
97  1066  1101  1057  1098  1132  1078  1067
98  1261  1229  1273  1312  1283  1296  1231
99  1585  1522  1537  1590  1591  1558  1548

[100 rows x 7 columns]

Обновление

df.apply(lambda x: x['A'] + x['B']*2 + x['C']*3 + x['D']*4 + x['E']*5 + x['F']*5 + x['G']*5,1)

0      755
1     1365
2      985
3     1078
4     1045
      ... 
95    1318
96    1323
97    1066
98    1261
99    1585
Length: 100, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...