试图提供与R的sweepfunction等效的python(如here)的其他问题并未真正解决最有用的多个参数的情况.
假设我希望将一个2自变量函数应用于具有来自另一个DataFrame列的匹配元素的Dataframe的每一行:
df = data.frame("A" = 1:3,"B" = 11:13)df2= data.frame("X" = 10:12,"Y" = 10000:10002)sweep(df,1,FUN="*",df2$X)
在python中,我通过对行计数基本上是循环的应用apply获得了等效结果.
df = pd.DataFrame( { "A" : range(1,4),"B" : range(11,14) } )df2 = pd.DataFrame( { "X" : range(10,13),"Y" : range(10000,10003) } )pd.SerIEs(range(df.shape[0])).apply(lambda row_count: np.multiply(df.iloc[row_count,:],df2.iloc[row_count,df2.columns.get_loc('X')]))
我非常怀疑这在大熊猫中是否有效,有什么更好的方法?
应用*时,代码的两位都应导致数据帧/矩阵为6个数字:
A B1 10 1102 22 1323 36 156
我应该明确指出,目标是像这样说:
df = data.frame("A" = 1:3,"Y" = 10000:10002)myFunc = function(a,b) { floor((a + b)^min(a/2,b/3)) }sweep(df,FUN=myFunc,df2$X)
导致:
A B[1,] 3 4[2,] 3 4[3,] 3 5
在python熊猫中这样做的好方法是什么?最佳答案如果我正确理解了这一点,则您正在寻找将二进制函数f(x,y)逐行应用于数据框(对于x),并使用来自y系列的参数.一种实现方法是从熊猫内部内部借用实现.如果要扩展此功能(例如,沿列应用,只要f为二进制,则可以类似的方式完成.如果需要更多参数,则可以对f进行部分处理以使其成为二进制
import pandas as pdfrom pandas.core.dtypes.generic import ABCSerIEsdef sweep(df,serIEs,FUN): assert isinstance(serIEs,ABCSerIEs) # row-wise application assert len(df) == len(serIEs) return df._combine_match_index(serIEs,FUN)# define your binary operatordef f(x,y): return x*y # the input data framesdf = pd.DataFrame( { "A" : range(1,10003) } )# applytest1 = sweep(df,df2.X,f)# performance# %timeit sweep(df,f)# 155 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs,10000 loops each)## another methodimport numpy as nptest2 = pd.SerIEs(range(df.shape[0])).apply(lambda row_count: np.multiply(df.iloc[row_count,df2.columns.get_loc('X')]))# %timeit performance# 1.54 ms ± 56.4 µs per loop (mean ± std. dev. of 7 runs,1000 loops each)assert all(test1 == test2)
希望这可以帮助. 总结
以上是内存溢出为你收集整理的高效的python熊猫等效项/带有多个参数的R扫描的实现 全部内容,希望文章能够帮你解决高效的python熊猫等效项/带有多个参数的R扫描的实现 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)