如果我有一个功能
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)
答案 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
循环