加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

高效的python熊猫等效项/带有多个参数的R扫描的实现

发布时间:2020-12-17 17:37:12 所属栏目:Python 来源:网络整理
导读:试图提供与R的sweepfunction等效的python(如here)的其他问题并未真正解决最有用的多个参数的情况. 假设我希望将一个2自变量函数应用于具有来自另一个DataFrame列的匹配元素的Dataframe的每一行: df = data.frame("A" = 1:3,"B" = 11:13)df2= data.frame("X"

试图提供与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   B
1 10 110
2 22 132
3 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 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,10003) } )

# apply
test1 = 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 method
import numpy as np
test2 = 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)

希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读