【发布时间】:2019-02-10 21:24:10
【问题描述】:
试图提供与R 的sweep 函数等效的python 的其他问题(如here)并没有真正解决最有用的多个参数的情况。
假设我希望对 Dataframe 的每一行应用一个 2 参数函数,并使用来自另一个 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')]))
我非常怀疑这在pandas 中是否有效,有什么更好的方法呢?
在应用* 时,这两个代码位都应生成 6 个数字的数据帧/矩阵:
A B
1 10 110
2 22 132
3 36 156
我应该明确说明,目的是将自己的功能插入到这种sweep 类似行为中说:
df = data.frame("A" = 1:3,"B" = 11:13)
df2= data.frame("X" = 10:12,"Y" = 10000:10002)
myFunc = function(a,b) { floor((a + b)^min(a/2,b/3)) }
sweep(df,1, FUN=myFunc,df2$X)
导致:
A B
[1,] 3 4
[2,] 3 4
[3,] 3 5
在 python pandas 中这样做的好方法是什么?
【问题讨论】:
-
我不明白你为什么需要
sweep,因为你只是在做df*df2$X。你能举一个你实际需要sweep的例子吗? -
我修改了问题。感谢您的评论,乘法不是问题的重点。
-
你的问题是什么?当然,您可以使用
apply、but I wouldn't recommend it's use unless you're sure there's no better option。现在,什么是“更好”实际上取决于您正在实现的功能。没有更多上下文,您的问题无法作为答案得到令人满意的解决,抱歉。 -
如果您确定迭代解决方案是唯一的,there are better alternatives using loops and comprehensions,更不用说用于 JIT 编译和更好性能的 numba 和 cython。那么,你的问题究竟是什么?
-
最好更新您的问题以添加有关您的实际问题的更多信息。