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)
目前还不清楚您的函数在做什么,但是对于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
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本质上是一个循环
| 归档时间: |
|
| 查看次数: |
12052 次 |
| 最近记录: |