【问题标题】:How to iterate an arbitrary function using vectorisation如何使用矢量化迭代任意函数
【发布时间】:2020-01-12 08:46:08
【问题描述】:

我想在不使用 for 循环的情况下迭代 pandas 数据帧中的给定函数,即使用矢量化。

我已经为这个函数写了一个for循环但是我想提高这个输出的效率。

def f(x,y,operation):
    if operation=='add':
        return x+y
    elif operation=='power':
        return x**y
    else:
        print('type can only be power or add')
df = pd.DataFrame({
              'first_entry':[1,np.nan,np.nan,np.nan,np.nan],
              'operation':[np.nan,'plus','power','plus','plus'],
              'operand':[np.nan,3,2,4,1]
              })
first_entry operation operand       expected_result
1           NA        NA            1
NA          plus      3             4 (= 1+3)
NA          power     2             16 (=4**2)
NA          plus      4             20 (=16+4)
NA          plus      1             21 (=20+1)

我想回来 pd.Series(1,4,16,20,21),即在数据帧上迭代 f

替代问题: 现在假设

def g(x,y,operation):
    if operation=='relative':
        return x*(1+y)
    elif operation=='absolute':
        return x+y
    else:
        print('type can only be relative or absolute')

我可以编写一个带有列表理解的函数来给出预期的结果吗?

first_entry operation operand       expected_result
1           NA            NA            1
NA          relative      3             4 (= 1*(3+1)
NA          absolute      2             6 (=4+2)
NA          relative      4             30 (=6*(4+1)
NA          absolute      1             31 (=30+1)

【问题讨论】:

  • 您在寻找apply吗?
  • Apply 不会迭代工作。例如,我知道 .cumsum() 是迭代的,所以我想有效地使用不同的函数进行迭代。
  • @rafaelc 是否可以使用列表理解? cumsum() 不是依赖于先前计算值的可向量化函数
  • 我同意@rafaelc,这很难矢量化,因为每次迭代都会更新值。如果您对 非矢量化 解决方案感兴趣,我可以发布一个。
  • 在我的实际示例中,函数 f(a,b,operation) 对于 operation==operation1 返回 a+b,对于 operation==operation2 返回 a*(1+b)。您认为这可以通过列表理解来实现吗?如果可以,如何实现?

标签: python pandas vectorization


【解决方案1】:

我没有直接得到a,b,c之间的关系。但是你可以使用 Pandas apply 函数 ApplyApply Map

在一个非常高的层次上,有类似的东西:

def f(row):
    if row["type"] == "add":
        return row["a"] + row["b"]
    elif row["type"] == "power":
        return row["a"] ** row["b"]

df["res"] = df.apply(f, axis=1)

这假设您的列分别命名为“a”、“b”和“type”。

【讨论】:

  • 这会将函数 f 应用于每一行。我想在结果列中的每个条目上迭代 f
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2021-10-13
相关资源
最近更新 更多