«Векторизация» пользовательской функции - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу определить функцию, которая принимает 2 серии и возвращает серию. Я мог бы пройтись по элементам обеих серий, но это утомительно. Я мог бы использовать np.vectorize(), но есть ли более простой способ?

Вот пример с игрушкой (Python 3.7) и то, что я пробовал:

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "strs": ["a", "b", "c"],
    "bools": [True, False, False]
    })

def custom_func(strs, bools):
    return [s+s if b else None for s, b in zip(strs, bools)]

# This works, but it's tedious (and slower than vectorized stuff)
df["new_strs"] = custom_func(df["strs"], df["bools"])


def custom_func2(s, b):
    return s+s if b else None

# This works, but is there a simpler way I'm missing?
df["new_strs2"] = np.vectorize(custom_func2)(df["strs"], df["bools"])

# Neither of these work. Error message:
# ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(),
# a.item(), a.any() or a.all().
#
# This one is what I'd call "simple"
df["new_strs2"] = custom_func2(df["strs"], df["bools"])
# This one isn't using vectorization but I tried it anyway
df["new_strs2"] = df["strs"].apply(custom_func2, args=df["bools"])

Вот как я сделал бы это в R:

df = data.frame(
  strs = c("a", "b", "c"),
  bools = c(TRUE, FALSE, FALSE)
)

custom_func2 = function(s, b) if (b) paste0(s, s) else NA

df$strs2 = custom_func2(df$strs, df$bools)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...