对Pandas数据帧中的每一行只运行一次函数

Dav*_*hme 14 python numpy function pandas

如果我有一个功能

def do_irreversible_thing(a, b):
    print a, b
Run Code Online (Sandbox Code Playgroud)

还有一个数据帧

df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

对于pandas数据帧中的每一行,只 运行一次函数的最佳方法是什么?正如其他问题指出的那样,像df.apply pandas这样的东西会在第一行调用该函数两次.即使使用numpy

np.vectorize(do_irreversible_thing)(df.a, df.b)
Run Code Online (Sandbox Code Playgroud)

导致函数在第一行被调用两次,df.T.apply()或者df.apply(...,axis = 1).

有没有比这个显式循环更快或更清晰的方法来调用每一行的函数?

   for idx, a, b in df.itertuples():
       do_irreversible_thing(a, b)
Run Code Online (Sandbox Code Playgroud)

Ros*_*dra 10

我这样做的方式(因为我也不喜欢用df.itertuples循环的想法)是:

df.apply(do_irreversible_thing, axis=1)
Run Code Online (Sandbox Code Playgroud)

然后你的功能应该像:

def do_irreversible_thing(x):
    print x.a, x.b
Run Code Online (Sandbox Code Playgroud)

这样你就可以在每一行上运行你的功能.

要么

如果你不能修改你的功能,你可以apply这样

df.apply(lambda x: do_irreversible_thing(x[0],x[1]), axis=1)
Run Code Online (Sandbox Code Playgroud)


EdC*_*ica 6

目前还不清楚您的函数在做什么,但是对于apply每一行的函数,您可以通过axis=1apply行传递给函数并传递感兴趣的列元素来实现:

In [155]:
def foo(a,b):
    return a*b
?
df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b'])
df.apply(lambda x: foo(x['a'], x['b']), axis=1)

Out[155]:
0     0
1     6
2    20
dtype: int64
Run Code Online (Sandbox Code Playgroud)

但是,只要您的函数不依赖于每一行的 df 变异,那么您就可以使用矢量化方法对整列进行操作:

In [156]:
df['a'] * df['b']

Out[156]:
0     0
1     6
2    20
dtype: int64
Run Code Online (Sandbox Code Playgroud)

原因是因为函数是矢量化的,所以它会更好地扩展,而这apply只是用于迭代你的 df 的语法糖,所以它for本质上是一个循环