gpt4 book ai didi

python - 具有多个参数的 R 扫描的高效 python pandas 等效/实现

转载 作者:行者123 更新时间:2023-11-28 17:00:55 24 4
gpt4 key购买 nike

其他试图提供等同于 Rsweep 函数(如 here )的 python 的问题并没有真正解决这个问题最有用的多个参数。

假设我希望将一个 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 like behavior say:

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 是二进制的。如果你需要更多的参数,你可以简单地在 f 上做一个 partial使其成为二进制

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 - 具有多个参数的 R 扫描的高效 python pandas 等效/实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54621203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com