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

时间:2019-02-10 21:24:11

标签: python pandas dataframe

试图提供与float-right的{​​{1}}函数等效的{ "update_id": 290285, "message": { "message_id": 12, "from": { "id": 117854, "is_bot": false, "first_name": "", "last_name": "", "language_code": "fa" }, "date": 1549829158, "chat": { "id": "you need this to start conversation", "type": "private", "first_name": "user_firstname", "last_name": "user_last name" }, "connected_website": "the domain mapped to your bot" } 的其他问题(例如here)并没有真正解决多参数的情况有用。

说我想将一个2自变量函数应用于具有来自另一个DataFrame列的匹配元素的Dataframe的每一行:

python

R中,我使用sweep得到了等效的内容,基本上是遍历行计数的循环。

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时,代码的两位都应导致数据帧/矩阵为6个数字:

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中:

*

导致:

   A   B
1 10 110
2 22 132
3 36 156

在python熊猫中做到这一点的好方法是什么?

2 个答案:

答案 0 :(得分:1)

pandas

df.mul(df2.X,axis=0)
    A    B
0  10  110
1  22  132
2  36  156

答案 1 :(得分:1)

如果我正确理解了这一点,那么您正在寻找将二进制函数f(x,y)逐行应用于数据帧(对于x)的过程,并使用一系列y的参数。一种实现方法是从熊猫内部内部借用实现。如果要扩展此功能(例如,沿列应用,只要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)

希望这会有所帮助。