为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?