为Pandas数据框中的每一行运行函数一次

如果我有一个功能

def do_irreversible_thing(a, b):
    print a, b

和一个数据帧,说

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

什么是对的大熊猫数据帧的每一行运行功能恰好一次的最佳途径。 正如其他问题所指出的,像df.apply pandas这样的东西会为第一行调用两次函数。 即使使用numpy

np.vectorize(do_irreversible_thing)(df.a, df.b)

使函数在第一行被调用两次,就像df.T.apply()或df.apply(...,axis = 1)一样。

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

   for idx, a, b in df.itertuples():
       do_irreversible_thing(a, b)

目前还不清楚你的函数在做什么,而是为每行apply一个函数,你可以通过传递axis=1来逐行apply你的函数并传递感兴趣的列元素:

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

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

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

Out[156]:
0     0
1     6
2    20
dtype: int64

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


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

df.apply(do_irreversible_thing, axis=1)

然后你的功能应该是这样的:

def do_irreversible_thing(x):
    print x.a, x.b

这样你应该可以在每一行上运行你的函数。

要么

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

df.apply(lambda x: do_irreversible_thing(x[0],x[1]), axis=1)
链接地址: http://www.djcxy.com/p/91271.html

上一篇: Run function exactly once for each row in a Pandas dataframe

下一篇: How to start an animation from a custom Gesture Listener?