Я хочу определить функцию, которая принимает 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)