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

时间:2016-04-13 20:58:30

标签: python function numpy pandas

如果我有一个功能

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

一个数据框,比如说

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

为pandas数据框中的每一行运行一次函数的最佳方法是什么。 As在其他questions中指出,像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)

2 个答案:

答案 0 :(得分:5)

我这样做的方式(因为我也不喜欢用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)

答案 1 :(得分:3)

目前还不清楚你的函数是做什么的,但是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循环