python - 具有多个参数的 R 扫描的高效 python pandas 等效/实现
问题描述
试图提供与'函数python
等效的其他问题(如这里)并没有真正解决最有用的多个参数的情况。R
sweep
假设我希望将一个 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')]))
我非常怀疑这是否有效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 中这样做的好方法是什么?
解决方案
如果我理解正确,您希望将二进制函数 f(x,y) 逐行应用于数据帧(对于 x),并带有来自 y 的系列的参数。一种方法是从 pandas 内部借用实现。如果你想扩展这个函数(例如沿列应用,它可以以类似的方式完成,只要 f 是二进制的。如果你需要更多参数,你可以简单地partial
在 f 上做一个二进制
import pandas as pd
from pandas.core.dtypes.generic import ABCSeries
def 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 operator
def f(x, y):
return x*y
# the input data frames
df = pd.DataFrame( { "A" : range(1,4),"B" : range(11,14) } )
df2 = pd.DataFrame( { "X" : range(10,13),"Y" : range(10000,10003) } )
# apply
test1 = sweep(df, df2.X, f)
# performance
# %timeit sweep(df, df2.X, f)
# 155 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)#
# another method
import numpy as np
test2 = 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')]))
# %timeit performance
# 1.54 ms ± 56.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
assert all(test1 == test2)
希望这可以帮助。
推荐阅读
- python - 无法使用 Watson Assistant 获取 workspace_id
- java - 使用 JAVA 中的脚本创建一个反应应用程序
- python - What is the correct way to import modules when I'm writing my own module in python?
- selenium - Testcontainers Selenium 如何更新浏览器?
- python-3.x - 我想编写一个接受数字作为字符串的代码
- python - 如何在 Python 中向 matplotlib.annotate 添加百分比符号?
- r - 更改R中注释的字体大小
- c# - GDI+ 中出现一般错误。在保存压缩的 img 时,Microsoft 的代码片段是否有问题
- c# - 读取大型 CSV 文件的更快方法
- angular - 无法加载 PDF 文档 - Angular 8